Являются ли динамические компоновщики взаимозаменяемыми?

Являются ли динамические компоновщики взаимозаменяемыми?

Являются ли динамические компоновщики взаимозаменяемыми?

Допустим, я компилирую программу, например, с помощью gcc, связывая различные динамические библиотеки, с программой, которая будет использоваться во время выполнения с компоновщиком gnu для разрешения символов динамической библиотеки. И вместо использования компоновщика gnu у меня есть другой компоновщик, который мне нужен или который я хочу использовать.

Это сработает? Почему/почему нет?

решение1

Я предполагаю, что под «динамическим компоновщиком» вы имеете в виду динамический компоновщик/загрузчик, обычно известный как ld.so, а не компоновщик, используемый при сборке программ ld.

Динамический компоновщик/загрузчик тесно связан с библиотекой C, с которой он связан или даже является ее частью. В Linux, как обычно обсуждается здесь, обычным загрузчиком является загрузчик библиотеки GNU C; если вы посмотрите на его символы, вы увидите, что он извлекает символы из библиотеки C:

$ nm -D /lib/ld-linux.so.2 | grep -E ' A|D '
00028898 D _dl_argv
00000000 A GLIBC_2.0
00000000 A GLIBC_2.1
00000000 A GLIBC_2.3
00000000 A GLIBC_2.4
00000000 A GLIBC_PRIVATE
00028f28 D __libc_enable_secure
00028f24 D __libc_stack_end
00029040 D _rtld_global
000288a0 D _rtld_global_ro

ВидетьКак динамический компоновщик/загрузчик может быть динамически связан, как сообщает `file`?для получения подробной информации о том, как это работает.

Альтернативные библиотеки C предоставляют собственные динамические загрузчики; например, программы, созданные с помощьюмуслимна x86_64 укажите свой «интерпретатор» как /lib/ld-musl-x86_64.so.1, что является ссылкой на саму библиотеку musl C:

$ ls -l /lib/ld-musl-x86_64.so.1
lrwxrwxrwx 1 root root 25 Jan 23  2019 /lib/ld-musl-x86_64.so.1 -> x86_64-linux-musl/libc.so

Загрузчики полагаются на функции, предоставляемые связанными с ними библиотеками C, и наоборот.бытехнически возможно заменить данный загрузчик совместимой реализацией, но вы фактически перепишете существующий загрузчик, как минимум. Хотя базовая спецификация динамического загрузчика четко определена и ограничена — загрузка двоичного файла ELF (в Linux), связанных динамических библиотек и выполнение необходимого перемещения и т. д. — и поэтому можно представить замену любого данного загрузчика другим, все детали реализации имеют значение.

Обратите внимание, что пока каждый динамический загрузчик имеет свое каноническое имя, возможно, что одна система будет иметь разные загрузчики, используемые программами по мере необходимости. Вот как возможно, что система на основе библиотеки GNU C также может использоваться для сборки и запуска musl-бинарных файлов, и это открывает путь для таких усилий, какllvm-libc, или даже исторически, переход от libc.so.5к libc.so.6.

решение2

Они должны быть взаимозаменяемыми.

Хорошее обсуждение eg ldvs goldможно найти здесь:https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience

Также проверьте это:https://stackoverflow.com/questions/29361801/is-the-lld-linker-a-drop-in-replacement-for-ld-and-gold

Также есть LLD из проекта LLVM, который обещает статьсамый быстрыйиз них всех.

Связанный контент