我需要更改目标文件或库中的符号可见性。例如,一个特定的共享对象有一个符号名称,但它是本地的,所以我无法绑定它(较低的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的可见性属性。
答案 0 :(得分:1)
您可以使用objcopy
选项尝试(未经测试)--globalize-symbol
。但是,这只适用于归档,而不是动态库,因为您可以修改普通符号表而不是(散列)动态符号表。
令人厌恶的黑客是确定例程与全局的偏移(使用objdump并将其写入makefile中的文件),然后创建一个函数指针,然后跳转到那个(yuck)。