Без изменения и перекомпиляции сборок библиотек gnu gcc и stdc ++ мне нужно иметь возможность воспроизводить динамически загружаемые версии этих библиотек с другим встроенным сонамом.
Я подумал, что буду умнее, использую доступные статические версии и перепакую их примерно так:
ld -E -shared -static "-lstdc++" -lgcc -lgcc_eh -o librepackaged_standard.so
librepacked_standard.so создан без предупреждений или ошибок, но ldd сообщает, что это не динамическая библиотека, а readelf сообщает только об этих основных символах:
Symbol table '.symtab' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000201000 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
2: 0000000000201000 0 NOTYPE GLOBAL DEFAULT ABS _edata
3: 0000000000201000 0 NOTYPE GLOBAL DEFAULT ABS _end
Я не уверен, почему ld не вводит все символы, определенные статически. Я также не знаю, есть ли какие-то другие специальные параметры, которые мне нужны, чтобы это работало.
Другой вариант - если есть известный кроссплатформенный способ простого изменения сонама, встроенного в исходные библиотеки elf. В настоящее время меня интересуют только двоичные файлы в формате эльфов. Я не заинтересован в написании собственного инструмента для изменения .soname в существующих двоичных файлах.
UPDATE:
Причина, по которой символы не компилировались, заключается в том, что ld
обрабатывает статические двоичные файлы иначе, чем файлы .o. По умолчанию он не импортирует символы из файла .a, если они не требуются другой библиотекой в строке ссылки. Я исправил это с помощью опции --whole-archive.
Однако это дает мне еще одну ошибку: relocation R_X86_64_32S against
_ZSt12_S_first_one 'нельзя использовать при создании общего объекта; при повторной компиляции с -fPIC and
не удалось прочитать символы: Bad value` Они оба из libstdc ++. a в архиве bitset.o. Поэтому я не могу просто перекомпилировать .a в динамическую библиотеку, потому что компиляция GNU GCC по умолчанию не компилирует объектные файлы, используемые для статических библиотек с опцией PIC.
Это оставляет меня с поиском инструмента elf или перекомпиляцией GNU GCC с изменениями в его сборке.
Как указано в одном из ответов, вопросы лицензирования могут быть проблемой для любого из этих подходов. Мой лучший ответ заключается в том, что нам нужно изменить наши требования и найти другое решение, которое не предполагает какого-либо изменения или переупаковки стандартных библиотек GCC.