LINUX.ORG.RU

Линкер, не удалять неиспользуемые классы


0

0

Есть программа на C++ в виде статической либы и фронтэнда. У нее есть плагины, которые тоже используют эту либу (но, понятное дело, не линкуются с ней). В либе есть класс, который используется только в плагинах. Проблема в том, при линковке фронтенда этот класс выкидывается (линкер думает, что раз он нигде не используется, то не нужен). Как ему сказать, чтобы он этого не делал?

И заодно - насколько корректен такой подход к плагинам - делать .so, использующее символы, определенные в другом месте? Это будет собираться, скажем, на Windows? Или лучше сделать либу динамической и все (и фронтенд и плагины) линковать с ней?


Почитал маны, нашел про -rdynamic, но оно не работает. Класс есть в либе, но в итоговом исполняемом файле отсутствует.

AMDmi3
() автор топика

Сделал минимальный testcase. В есть два класса, один используется, второй нет. Если классы определить в одном файле, они будут в бинарнике. Если в разных, то неиспользуемого класса не будет. -rdynamic ни на что не влияет. Что делать?

AMDmi3
() автор топика
Ответ на: комментарий от AMDmi3

--export-dynamic
When creating a dynamically linked executable, add all symbols to the dynamic symbol
table. The dynamic symbol table is the set of symbols which are visible from
dynamic objects at run time.

If you do not use this option, the dynamic symbol table will normally contain only
those symbols which are referenced by some dynamic object mentioned in the link.

If you use "dlopen" to load a dynamic object which needs to refer back to the sym-
bols defined by the program, rather than some other dynamic object, then you will
probably need to use this option when linking the program itself.

You can also use the dynamic list to control what symbols should be added to the
dynamic symbol table if the output format supports it. See the description of
--dynamic-list.

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

-rdynamic это оно и есть.

-rdynamic
Pass the flag --export-dynamic to the ELF linker, on targets that support it.

В общем rdynamic все-таки нужен, ибо без него, даже если символ есть в бинарнике, плагины его не видят. Но на выкидывание он не влияет. Дикость в том, что если линковать со статической либой из двух .o, классс выкидывается. Если линковать просто с этими двумя объектниками, но нет :/

AMDmi3
() автор топика
Ответ на: комментарий от AMDmi3

То есть ты библиотеку линкуешь с фронт-эндом статичкски? Лучше сделай shared библиотеку и подключай и к фронт-энду и к плугинам.

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

> То есть ты библиотеку линкуешь с фронт-эндом статичкски?

Угу

> Лучше сделай shared библиотеку и подключай и к фронт-энду и к плугинам

Не хотелось бы, хотя надо над этим подумать

> Возможно стоит посмотреть в сторону --whole-archive?

Оно, спасибо

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