реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> WinARM(GCC), вопрос по компиляции и линковке
Airan
сообщение Sep 21 2007, 10:55
Сообщение #1





Группа: Новичок
Сообщений: 13
Регистрация: 1-09-07
Пользователь №: 30 202



Доброго времени суток!
Для сборки проэкта под at91sam7s-серии кристал использую WinARM(GCC). Необходимо настроить GCC таким образом, чтобы в конечный бинарник не входили функции, к которым нет в программе обращения. Сложность заключается в том, что проект состоит из нескольких блоков(каждому соответствует свой С-файл). При компиляции каждый такой модую собирается в отдельный обьекнтик, а потом все обьектники линкуюся. Так вот функция обьявленная и описаная в одном модуле может применяться в другом и т.п. Включение лбого уровня оптимизации делу не помогает. Подскажите как с этим бороться?
Зарание Спасибо.
Go to the top of the page
 
+Quote Post
axle
сообщение Sep 21 2007, 11:10
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



При компиляции используй опции -ffunction-sections и -fdata-sections.
При сборке -Wl,--gc-sections.
Go to the top of the page
 
+Quote Post
Airan
сообщение Sep 21 2007, 11:53
Сообщение #3





Группа: Новичок
Сообщений: 13
Регистрация: 1-09-07
Пользователь №: 30 202



Цитата(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]

Сообщение отредактировал Airan - Sep 21 2007, 11:45
Go to the top of the page
 
+Quote Post
axle
сообщение Sep 21 2007, 14:05
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



Цитата(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 файлы.
Go to the top of the page
 
+Quote Post
Airan
сообщение Sep 21 2007, 15:06
Сообщение #5





Группа: Новичок
Сообщений: 13
Регистрация: 1-09-07
Пользователь №: 30 202



Цитата(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


Сообщение отредактировал Airan - Sep 21 2007, 15:16
Go to the top of the page
 
+Quote Post
axle
сообщение Sep 21 2007, 15:26
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



Цитата(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 все в порядке, то даже не знаю. У меня эти опции работали.
Go to the top of the page
 
+Quote Post
Airan
сообщение Sep 21 2007, 16:07
Сообщение #7





Группа: Новичок
Сообщений: 13
Регистрация: 1-09-07
Пользователь №: 30 202



Цитата(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-функцию считает нигде не используемой, ну и соответственно всё, что вызывается в них заодно.
Go to the top of the page
 
+Quote Post
Airan
сообщение Sep 24 2007, 07:58
Сообщение #8





Группа: Новичок
Сообщений: 13
Регистрация: 1-09-07
Пользователь №: 30 202



Глюк найден. Как я и предполагал, линкер не знал имя функции, которая считается точкой входа, а по сему весь код, который следовал далее был удалён. вопрос решил принудительным указанием точки входа.
--entry=_startup
Go to the top of the page
 
+Quote Post
axle
сообщение Sep 24 2007, 08:08
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



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

А, ну теперь понятно.
Обычно в скрипте линкера присутствуетт строчка ENTRY(_startup), которая указывает на точку входа. Думаю у вас ее либо нет, либо она указывает на несуществующую метку.
В любом случае, хорошо что заработало. smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 20:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01596 секунд с 7
ELECTRONIX ©2004-2016