Уникальный глобальный символ при связывании со статическим libstd - PullRequest
0 голосов
/ 04 июля 2018

Я создаю общую библиотеку для другой системы. Я хотел связать его как статический, включая все libstdc и libstdc ++, чтобы я мог использовать его как есть на другом, более старом linux. Однако, когда я связал это с нижеуказанными параметрами:

/app/localstorage/dev/gcc/4.8.5/bin/g++ -fPIC -static-libgcc -static-libstdc++ -fno-gnu-unique -shared -Wl,-soname,libsgxstconnector.so -o libsgxstconnector.so one.o two.o -ldl -lrt

В старых версиях Linux я не могу загрузить библиотеку. Сообщение об ошибке гласит

libsgxstconnector.so: undefined symbol: _ZNSt8messagesIcE2idE

nm -a на старом сервере показывает:

0000000000411c20 ? _ZNSt8messagesIcE2idE

это? Флаг означает, что ld его не знает, и это, вероятно, причина, по которой он не может загружаться В моей сборке Linux это показывает, что это уникальный глобальный символ (флаг U)

0000000000411c20 u _ZNSt8messagesIcE2idE

Отсюда вопрос: есть ли возможность удалить эту функцию из моей связанной библиотеки? И есть ли хорошие практики для создания бинарных файлов, не зависящих от Linux? Может быть, -fno-gnu-unique должен быть в другом месте?

Вывод ldd одинаков во всех системах:

linux-vdso.so.1 =>  (0x00007ffd23dac000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fed7ce12000)
librt.so.1 => /lib64/librt.so.1 (0x00007fed7cc09000)
libm.so.6 => /lib64/libm.so.6 (0x00007fed7c985000)
libc.so.6 => /lib64/libc.so.6 (0x00007fed7c5f1000)
/lib64/ld-linux-x86-64.so.2 (0x00000030c4800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fed7c3d3000)
...