Мне нужно изменить видимость символа в объектном файле или библиотеке. Например, у определенного общего объекта есть имя символа, но оно локальное, поэтому я не могу привязаться к нему (нижний t
указывает на локальный в разделе ТЕКСТ):
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i OPENSSL_cpuid_setup
00000000000c3f80 t OPENSSL_cpuid_setup
000000000008a360 t fips_openssl_cpuid_setup
Тот же символ присутствует в архиве, но архив не используется в этом проекте (верхняя T
указывает глобальный в разделе ТЕКСТ):
$ nm /usr/local/ssl/lib/libcrypto.a | grep -i OPENSSL_cpuid_setup
0000000000000310 T OPENSSL_cpuid_setup
000000000000f8e0 T fips_openssl_cpuid_setup
Я бы хотел, чтобы видимость OPENSSL_cpuid_setup
была глобальной, а не локальной.
Есть ли способ изменить видимость символа в объектном файле или библиотеке? Я изучил инструменты Binutil, и похоже, что подходящего инструмента нет.
Для полноты картины "самые простые" методы недоступны, поскольку исходный код изолирован и не может быть изменен. Самые простые методы включают (1) удаление static
из объявления; и (2) использование атрибутов видимости GCC.