Почему компоновщик не удаляет неиспользуемые символы при связывании статической библиотеки перед ее публикацией?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему компоновщик не удаляет неиспользуемые символы при связывании статической библиотеки перед ее публикацией?

Сообщение Anonymous »

У меня есть статическая библиотека, динамическая библиотека (которая использует статическую) и исполняемый файл (которая использует обе):

Код: Выделить всё

$ cat static.cpp
int use_static()
{
return {};
}

void unused_in_static() {}

Код: Выделить всё

$ cat shared.cpp
void use_static();

void use_shared()
{
use_static();
}

void unused_in_shared() {}

Код: Выделить всё

$ cat app.cpp
void use_shared();
void use_static();

int main()
{
use_shared();
use_static();
}
Затем я их строю:

Код: Выделить всё

#!/bin/bash -xe
COMPILE_OPTIONS="-ffunction-sections -fPIC"

g++ $COMPILE_OPTIONS -c -o static.o static.cpp
ar qc libstatic.a static.o

g++ $COMPILE_OPTIONS -c -o shared.o shared.cpp
g++ -Wl,-gc-sections -shared -o libshared.so shared.o libstatic.a

g++ $COMPILE_OPTIONS -c -o app.o app.cpp
g++ -Wl,-gc-sections -Wl,-rpath=. -o app app.o libstatic.a libshared.so
Странно, что скомпилированное приложение содержит функцию unused_in_static, которая нигде не используется:

Код: Выделить всё

readelf -s app | grep unused
13: 000000000000079a     7 FUNC    GLOBAL DEFAULT   14 _Z16unused_in_staticv
57: 000000000000079a     7 FUNC    GLOBAL DEFAULT   14 _Z16unused_in_staticv
Я ожидаю, что он будет удален (спасибо -ffunction-sections и -Wl,-gc-sections).
То же самое произойдет, если я добавлю libstatic в компоновщик после libshared:

Код: Выделить всё

g++ -Wl,-gc-sections -Wl,-rpath=. -o app app.o libstatic.a libshared.so libstatic.a
Но, что удивительно, если я поменяю порядок libshared и libstatic, все будет работать нормально:

Код: Выделить всё

g++ -Wl,-gc-sections -Wl,-rpath=. -o app app.o libshared.so libstatic.a
readelf -s app | grep unused
Почему сбор мусора неиспользуемой функции зависит от порядка ссылок? Неправильный ли первый или второй порядок ссылок?

Подробнее здесь: https://stackoverflow.com/questions/687 ... brary-befo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»