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

 
 
> linker
Злодей
сообщение Jun 17 2009, 11:24
Сообщение #1


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

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Здравствуйте!

WinAVR, родной makefile.

main.c
Код
#include <avr/io.h>

int do_not_link_me( int arg )
{
    return arg * arg;
}

int main( void )
{
}


main.lss ( По сути листинг прошивки )
Код
int do_not_link_me( int arg )
{
  88:    88 9f           mul    r24, r24
  8a:    90 01           movw    r18, r0
  8c:    89 9f           mul    r24, r25
  8e:    30 0d           add    r19, r0
  90:    98 9f           mul    r25, r24
  92:    30 0d           add    r19, r0
  94:    11 24           eor    r1, r1
    return arg * arg;
}


Хочу так, что бы в прошивке не было неиспользуемых функций. Усердно читаю и пробую ld options...

Помогите, пожалуста, терминами ( как эту проблему правильно называть ) ну и с решением. Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Злодей
сообщение Jun 17 2009, 13:09
Сообщение #2


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

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Добавлю, что в приведённом примере функция не линкуется если её объявить static.

Что сделать, бы модули неиспользуемые не линковать? Некоторые доки вгоняют в полную печаль...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 19 2009, 18:16
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Злодей @ Jun 17 2009, 18:09) *
Добавлю, что в приведённом примере функция не линкуется если её объявить static.
Хочу добавить, что иначе и быть не может: у статических объектов область видимости - файл, поэтому линкеру они не видны, он о их существовании ничего не знает (исключением, по-моему, яувляются только статические члены классов).
Цитата(Злодей @ Jun 19 2009, 03:11) *
(А то забуду) В FAQ надо отправить hex2bin и bin2hex посредством srecord
А что это и для чего?


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 20 2009, 18:31
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(alx2 @ Jun 19 2009, 21:16) *
у статических объектов область видимости - файл, поэтому линкеру они не видны, он о их существовании ничего не знает (исключением, по-моему, яувляются только статические члены классов).

Такие обьекты должны быть видны линкеру посредством их использования другими (нестатическими) обьектами\функциями. В примпре, приведённом у топикстартера, функция int do_not_link_me( int arg ) нигде не используется, поэтому если её обьявить статической, она справедливо будет выкинута.
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 21 2009, 14:24
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(IgorKossak @ Jun 20 2009, 23:31) *
Такие обьекты должны быть видны линкеру посредством их использования другими (нестатическими) обьектами\функциями.
? Не понял. Что значит "видны посредством использования"?
Код
$ cat test2.c
static int foo(int x)
{
    return x + 5;
}

int bar(int x)
{
    return foo(x * 2);
}
$ gcc -c test2.c
$ nm -g test2.o
0000000c T bar


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 21 2009, 17:17
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(alx2 @ Jun 21 2009, 17:24) *
? Не понял. Что значит "видны посредством использования"?

В Вашем же примере статическая функция static int foo(int x) вызывается в int bar(int x), поэтому (если в свою очередь последняя функция также используется в приложении) линкер не должен её выкинуть.
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 23 2009, 09:29
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(IgorKossak @ Jun 21 2009, 22:17) *
В Вашем же примере статическая функция static int foo(int x) вызывается в int bar(int x), поэтому (если в свою очередь последняя функция также используется в приложении) линкер не должен её выкинуть.
Верно, что не должен, но не поэтому. Как уже сказал aesok, линкер не работает с функциями. Линкер работает с секциями. Он либо включает секцию в выходной файл, либо не включает. Целью приведенного мной примера было показать, что в сгенеренном ассемблером объектном файле вообще нет глобального символа foo, таким образом, линкер вообще не узнает о существовании такой функции.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 23 2009, 18:11
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(alx2 @ Jun 23 2009, 13:29) *
Целью приведенного мной примера было показать, что в сгенеренном ассемблером объектном файле вообще нет глобального символа foo,


Нет, нету глобального символа foo, потому что функция foo статическая и ее область видимости ограничивается одним модулем.

Цитата(alx2 @ Jun 23 2009, 13:29) *
таким образом, линкер вообще не узнает о существовании такой функции.


Если компилятор не проинлайнит функцию foo, а то линкер увидет метку foo. И в даном случае при компиляции примера без оптимизации видим:

Код
$ nm  test2.o
00000000 b .bss
00000000 d .data
00000000 t .text
0000000b T _bar
00000000 t _foo



Анатолий.
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 24 2009, 10:54
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(aesok @ Jun 23 2009, 23:11) *
Если компилятор не проинлайнит функцию foo, а то линкер увидет метку foo.
Код
00000000 t _foo
Так это же локальный символ - буква "t" маленькая. Разве линкер работает с локальными символами? Я почему-то считал, что он работает только с глобальными, а локальные его интересовать совершенно не должны. Это будет диверсия, если линкер удовлетворит внешнюю ссылку локальным объектом...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Злодей   linker   Jun 17 2009, 11:24
|- - aesok   Для GCC: Единицей обработки компилятора является ...   Jun 20 2009, 20:18
|- - aesok   Цитата(IgorKossak @ Jun 21 2009, 21:17) В...   Jun 21 2009, 18:58
- - mdmitry   Уже обсуждалось на форуме, поищите, пожалуйста. Со...   Jun 17 2009, 13:13
- - Злодей   Спасибо, коллега подсказал параметры компиляции -f...   Jun 17 2009, 13:34
- - mdmitry   Именно они, но я их не могу запомнить. Не пора...   Jun 18 2009, 12:16
- - Злодей   Тогда сразу в -Os ... Вероятно, есть ньюансы, из-з...   Jun 18 2009, 22:11
- - IgorKossak   Да, Вы правы, оговорился. Но независимо от того, к...   Jun 22 2009, 06:29
|- - demiurg_spb   Цитата(IgorKossak @ Jun 22 2009, 10:29) р...   Jun 22 2009, 14:41
|- - mdmitry   Цитата(demiurg_spb @ Jun 22 2009, 18:41) ...   Jun 22 2009, 16:05
|- - demiurg_spb   Цитата(mdmitry @ Jun 22 2009, 20:05) объя...   Jun 22 2009, 16:14
- - mdmitry   Гарантированно инлайн и никаких мыслей более   Jun 22 2009, 16:22
- - demiurg_spb   Цитата(mdmitry @ Jun 22 2009, 20:22) Гара...   Jun 22 2009, 16:26
- - ReAl   Цитата(demiurg_spb @ Jun 22 2009, 19:26) ...   Jun 22 2009, 16:58


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:27
Рейтинг@Mail.ru


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