Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinARM(GCC)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Airan
Доброго времени суток!
Для сборки проэкта под at91sam7s-серии кристал использую WinARM(GCC). Необходимо настроить GCC таким образом, чтобы в конечный бинарник не входили функции, к которым нет в программе обращения. Сложность заключается в том, что проект состоит из нескольких блоков(каждому соответствует свой С-файл). При компиляции каждый такой модую собирается в отдельный обьекнтик, а потом все обьектники линкуюся. Так вот функция обьявленная и описаная в одном модуле может применяться в другом и т.п. Включение лбого уровня оптимизации делу не помогает. Подскажите как с этим бороться?
Зарание Спасибо.
axle
При компиляции используй опции -ffunction-sections и -fdata-sections.
При сборке -Wl,--gc-sections.
Airan
Цитата(axle @ Sep 21 2007, 14:10) *
При компиляции используй опции -ffunction-sections и -fdata-sections.
При сборке -Wl,--gc-sections.

в elf-файле нет никакого упоминания ни об одной моей функции, а бинарник получается нулевого размера

Цитата(axle @ Sep 21 2007, 14:10) *
-Wl,--gc-sections.

подскажите, где можно почитать про опции -Wl,[option]
axle
Цитата(Airan @ Sep 21 2007, 18:53) *
в elf-файле нет никакого упоминания ни об одной моей функции, а бинарник получается нулевого размера
подскажите, где можно почитать про опции -Wl,[option]

Почитать можно здесь http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gc...ml#Link-Options
Вкратце: Так как обычно для сборки вызывается gcc, а уж он вызывает линкер (по многим причинам, я знаю только парочку), то необходимо передавать линкеру его опции. Это и делается с помощью -Wl,[option].

Про elf и нулевой размер бинарника сложно сказать. Посмотрите *.map, *.lss файлы.
Airan
Цитата(axle @ Sep 21 2007, 17:05) *

спасибо, понял. А про опции "--gc-sections" и тому подобных?

Цитата(axle @ Sep 21 2007, 17:05) *
Про elf и нулевой размер бинарника сложно сказать. Посмотрите *.map, *.lss файлы.


в map-файле перед обычным его началом появляется следующие строчки, и больше никаках упоминаний ни о функции main, ни о 2х ф-циях f1 и f2 из модуля add
Цитата(main.map @ map)
Discarded input sections

.text 0x00000000 0x0 ./startup/Cstartup.o
.data 0x00000000 0x0 ./startup/Cstartup.o
.bss 0x00000000 0x0 ./startup/Cstartup.o
.text 0x00000000 0x0 ./startup/Cstartup_SAM7.o
.data 0x00000000 0x0 ./startup/Cstartup_SAM7.o
.bss 0x00000000 0x0 ./startup/Cstartup_SAM7.o
.text.AT91F_LowLevelInit
0x00000000 0x0 ./startup/Cstartup_SAM7.o
.text 0x00000000 0x0 add.o
.data 0x00000000 0x0 add.o
.bss 0x00000000 0x0 add.o
.text.f1 0x00000000 0x0 add.o
.text.f2 0x00000000 0x0 add.o
.text 0x00000000 0x0 main.o
.data 0x00000000 0x0 main.o
.bss 0x00000000 0x0 main.o
.text.main 0x00000000 0x0 main.o

Memory Configuration

Name Origin Length Attributes
FLASH 0x00100000 0x00040000 xr
DATA 0x00200000 0x00010000 rw
STACK 0x00210000 0x00000000 rw
*default* 0x00000000 0xffffffff

Linker script and memory map
...


, а lss вообще пуст как гнёзда по осени
Цитата(main.lss @ lss)
main.elf: file format elf32-littlearm

Sections:
Idx Name Size VMA LMA File off Algn
0 .comment 00000051 00000000 00000000 00000034 2**0
CONTENTS, READONLY
1 .debug_aranges 00000020 00000000 00000000 00000088 2**3
CONTENTS, READONLY, DEBUGGING
2 .debug_info 0000005c 00000000 00000000 000000a8 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_abbrev 00000014 00000000 00000000 00000104 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_line 00000092 00000000 00000000 00000118 2**0
CONTENTS, READONLY, DEBUGGING
axle
Цитата(Airan @ Sep 21 2007, 22:06) *
А про опции "--gc-sections" и тому подобных?

Очевидно в документации на GNU ld http://sourceware.org/binutils/docs-2.18/ld/index.html smile.gif
Цитата(Airan @ Sep 21 2007, 22:06) *
в map-файле перед обычным его началом появляется следующие строчки, и больше никаках упоминаний ни о функции main, ни о 2х ф-циях f1 и f2 из модуля add

Похоже линкер выкинул весь код. Если без -ffunction-sections все в порядке, то даже не знаю. У меня эти опции работали.
Airan
Цитата(axle @ Sep 21 2007, 18:26) *
Очевидно в документации на GNU ld http://sourceware.org/binutils/docs-2.18/ld/index.html smile.gif

о! действительно, Спасибо ОГРОМНОЕ!

Цитата(axle @ Sep 21 2007, 18:26) *
Похоже линкер выкинул весь код. Если без -ffunction-sections все в порядке, то даже не знаю. У меня эти опции работали.


угу, похоже на то... На самом деле даже с -ffunction-sections всё в прорядке, но когда при сборке появляется ключ --gc-sections, теряем весь код. Создается впечатление, что он и startup-код и main-функцию считает нигде не используемой, ну и соответственно всё, что вызывается в них заодно.
Airan
Глюк найден. Как я и предполагал, линкер не знал имя функции, которая считается точкой входа, а по сему весь код, который следовал далее был удалён. вопрос решил принудительным указанием точки входа.
--entry=_startup
axle
Цитата(Airan @ Sep 24 2007, 14:58) *
Глюк найден. Как я и предполагал, линкер не знал имя функции, которая считается точкой входа, а по сему весь код, который следовал далее был удалён. вопрос решил принудительным указанием точки входа.
--entry=_startup

А, ну теперь понятно.
Обычно в скрипте линкера присутствуетт строчка ENTRY(_startup), которая указывает на точку входа. Думаю у вас ее либо нет, либо она указывает на несуществующую метку.
В любом случае, хорошо что заработало. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.