LINUX.ORG.RU

Линковка статической либы


0

1

Доброго времени суток.
Давным-давно, во времена windows и msvc6, один добрый дядя рассказал мне, что если сделать статическую библиотеку, и прилинковать к своему приложению, то прилинкованы будут исключительно те функции, которые используются (прямо или косвенно).
Как-то не доводилось мне до этого, но пописывая под atmega32 начинаешь задумываться о размере своих программ. И каково же было мое удивление, когда я обнаружил что линковщик присоединяет весь .o из архива, не дробя его на функции.
В примере:

test1.c

void Test1()
{
}

void Test2()
{
}

если его собрать в архив, а потом прилинковать к приложению, которое пользует только Test1, то Test2 тоже будет прилинкован (а он может жрать 100500 байт флеша)

что же это получается товарищи, меня обманули?
или как-то можно добиться такого поведения? man ld изучал, может проглядел, буду благодарен если кто ткнет носом.

★★

Копать в сторону:

gcc
-ffunction-sections
-ffdata-sections

ld
--gc-sections

anon_666
()

Линкер не знает, какие функции вызываются из нужной тебе функции, и линкует весь объектный файл. Достаточно выделить нужную функцию в отдельный .o, в стандартных библиотеках так и делают.

unsigned ★★★★
()

вспомнил, был тред на эту тему на лоре, много чего интересного тогда выяснилось. Попробуй найти. Там ещё обсуждали --as-needed

true_admin ★★★★★
()
Ответ на: комментарий от unsigned

>Линкер не знает, какие функции вызываются из нужной тебе функции

Слив защитан.

Копать в сторону:

gcc -ffunction-sections -ffdata-sections

ld --gc-sections

anon_666 (11.08.2010 17:33:26)

anon_666
()
Ответ на: комментарий от anonymous

А таблицы экспорта/импорта?

Они создаются для файла целиком, а не для отдельных функций.

unsigned ★★★★
()
Ответ на: комментарий от anon_666

Как ld отслеживает зависимости между функциями?

unsigned ★★★★
()
Ответ на: комментарий от anonymous

--as-needed, на сколько я помню, для динамических библиотек

абсолютно верно, я и не говорил что это лекарство. Об этом в том треде и писали, просто привёл для того чтобы найти было легче.

Там было предложено решение каждую функцию пихать в свою секцию и уже ld исключал неиспользуемые секции при сборке.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.