170 похожих чатов

Вопрос больше в сторону линукса чем плюсов, но тем не

менее
$ readelf -Ws /usr/lib/libboost_program_options-mt.so | c++filt
Таблица символов «.dynsym» содержит 1163 элементов:
Чис: Знач Разм Тип Связ Vis Индекс имени
903: 0000000000054650 19 FUNC WEAK DEFAULT 11 boost::program_options::typed_value_base::~typed_value_base()
1022: 0000000000054510 15 FUNC WEAK DEFAULT 11 boost::program_options::typed_value_base::~typed_value_base()
1153: 0000000000054510 15 FUNC WEAK DEFAULT 11 boost::program_options::typed_value_base::~typed_value_base()
я бы понял почему так, если бы натравил readelf на статичекую либу - там было бы три объектника с реализацией одного инлайнового метода (например)
но почему так происходит для динамической либы? линкер же должен сводить дублирующиеся символы к одному уже при создании .so, не?

15 ответов

23 просмотра

скорее всего, дело в связывании https://en.wikipedia.org/wiki/Weak_symbol

Igor-Ivanov Автор вопроса
Sergey Sobolev
скорее всего, дело в связывании https://en.wikiped...

единственная гипотеза, да я просто не могу найти пока ни одного упоминания того, что weak могут дублироваться не только между разными объектами, но и в пределах одного 🤔

А так что выведет? objdump -T /usr/lib/libboost_program_options-mt.so | c++filt | grep "boost::program_options::typed_value_base::~typed_value_base()"

Igor-Ivanov Автор вопроса
Alexander Tulikov
А так что выведет? objdump -T /usr/lib/libboost_pr...

то же самое в другом обличьи 0000000000054650 w DF .text 0000000000000013 Base boost::program_options::typed_value_base::~typed_value_base() 0000000000054510 w DF .text 000000000000000f Base boost::program_options::typed_value_base::~typed_value_base() 0000000000054510 w DF .text 000000000000000f Base boost::program_options::typed_value_base::~typed_value_base()

Igor Ivanov
то же самое в другом обличьи 0000000000054650 w ...

это два разных деструктора, попробуй убрать c++filt и сравнить имена

Igor Ivanov
то же самое в другом обличьи 0000000000054650 w ...

Тогда это действительно из-за weak символов, объясняется почему и как тут: https://stackoverflow.com/questions/54750330/c-shared-libraries-have-duplicate-symbols

Igor-Ivanov Автор вопроса
Alexander Karaev
это два разных деструктора, попробуй убрать c++fil...

0000000000054650 w DF .text 0000000000000013 Base _ZN5boost15program_options16typed_value_baseD0Ev 0000000000054510 w DF .text 000000000000000f Base _ZN5boost15program_options16typed_value_baseD1Ev 0000000000054510 w DF .text 000000000000000f Base _ZN5boost15program_options16typed_value_baseD2Ev ...а это как? оО

Igor Ivanov
0000000000054650 w DF .text 0000000000000013 ...

::= D0 # deleting destructor ::= D1 # complete object destructor ::= D2 # base object destructor

Igor Ivanov
0000000000054650 w DF .text 0000000000000013 ...

The first destructor, called the complete object destructor, performs the destruction without calling delete() on the object. The second destructor, called the deleting destructor, calls delete() after destroying the object. Both destroy any virtual bases; a separate, non-virtual function, called the base object destructor, performs destruction of the object but not its virtual base subobjects, and does not call delete()

Igor-Ivanov Автор вопроса
Alexander Karaev
::= D0 # deleting destructor ::= D1 # complete obj...

а откуда это, какие-то сырцы гцц ответственные за манглинг?

Igor Ivanov
а откуда это, какие-то сырцы гцц ответственные за ...

https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling-special-ctor-dtor там же в разделе Definitions есть определения для всех видов деструкторов

Igor-Ivanov Автор вопроса
Alexander Karaev
The first destructor, called the complete object d...

слышал звон, да не помню где он спасибо, надо будет прочитать

Igor-Ivanov Автор вопроса
Alexander Tulikov
Тогда это действительно из-за weak символов, объяс...

и за это спасибо, двоение .dynsym / .syntab тоже где-то неподалёку вроде видел

Igor Ivanov
слышал звон, да не помню где он спасибо, надо буде...

Тут недавно было уже но в контексте конструкторов

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта