Изменить видимость символа в объектном файле или библиотеке ('t' -> 'T')

Мне нужно изменить видимость символа в объектном файле или библиотеке. Например, у определенного общего объекта есть имя символа, но оно локальное, поэтому я не могу привязаться к нему (нижний 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.


person jww    schedule 17.01.2014    source источник


Ответы (1)


Вы можете попробовать (не проверено) objcopy с опцией --globalize-symbol. Однако это будет работать только с архивом, а не с динамической библиотекой, поскольку вы можете изменять обычную таблицу символов, а не (хешированную) динамическую таблицу символов.

Отвратительный хак состоял бы в том, чтобы определить смещение подпрограммы от глобального (используя objdump и записав его в файл из вашего makefile), затем создать указатель на функцию, а затем перейти к нему (гадость).

person abligh    schedule 17.01.2014