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

时间:2014-01-17 20:19:49

标签: c shared-libraries visibility symbols binutils

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

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

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

$ 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 tools,看起来不像是一个合适的工具。

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

1 个答案:

答案 0 :(得分:1)

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

令人厌恶的黑客是确定例程与全局的偏移(使用objdump并将其写入makefile中的文件),然后创建一个函数指针,然后跳转到那个(yuck)。