C 更改对象文件或库中的符号可见性(';t';-&>;';t';)

C 更改对象文件或库中的符号可见性(';t';-&>;';t';),c,shared-libraries,visibility,symbols,binutils,C,Shared Libraries,Visibility,Symbols,Binutils,我需要更改对象文件或库中的符号可见性。例如,一个特定的共享对象有一个符号名,但它是本地的,因此我无法绑定到它(文本部分中较低的t表示本地): 存档中存在相同的符号,但该存档未在本项目中使用(上方的T表示文本部分中的全局): 我希望OPENSSL\u cpuid\u设置的可见性是全局的,而不是本地的 是否有方法更改对象文件或库中的符号可见性?我已经经历过了,但似乎没有合适的工具 为了完整起见,“最简单”的方法是不可用的,因为源代码是隔离的,不能更改。最简单的方法包括(1)从声明中删除静态;(2)使

我需要更改对象文件或库中的符号可见性。例如,一个特定的共享对象有一个符号名,但它是本地的,因此我无法绑定到它(文本部分中较低的
t
表示本地):

存档中存在相同的符号,但该存档未在本项目中使用(上方的
T
表示文本部分中的全局):

我希望
OPENSSL\u cpuid\u设置的可见性是全局的,而不是本地的

是否有方法更改对象文件或库中的符号可见性?我已经经历过了,但似乎没有合适的工具

为了完整起见,“最简单”的方法是不可用的,因为源代码是隔离的,不能更改。最简单的方法包括(1)从声明中删除
静态
;(2)使用GCC的可见性属性。

您可以使用
--globalize symbol
选项尝试(未测试)
objcopy
。但是,这只适用于存档,而不适用于动态库,因为您可以修改普通符号表,而不是(哈希)动态符号表

一个令人厌恶的方法是确定例程与全局的偏移量(使用objdump并将其从makefile写入文件),然后创建一个函数指针,然后跳到那个位置(糟糕)

$ nm /usr/local/ssl/lib/libcrypto.so | grep -i OPENSSL_cpuid_setup
00000000000c3f80 t OPENSSL_cpuid_setup
000000000008a360 t fips_openssl_cpuid_setup
$ nm /usr/local/ssl/lib/libcrypto.a | grep -i OPENSSL_cpuid_setup
0000000000000310 T OPENSSL_cpuid_setup
000000000000f8e0 T fips_openssl_cpuid_setup