更新使用“-Bsymbolic”链接器选项生成的 ELF 共享对象
Update ELF shared object generated with "-Bsymbolic" linker option
我认为“-Bsymbolic”选项在共享对象的 ELF 动态符号 table 中添加了一个标志。
有没有什么方法可以使用像 objcopy 这样的工具来删除这个标志,让它表现得像一个没有“-Bsymbolic”标志的共享对象?我将无法重新构建使用上述标志构建的库。
更多信息:
- 编译器:gcc
- 平台:手臂linux
不,-Bsymbolic
无法撤消。原因是 link 编辑器应用了消除某些重定位的放宽。例如,考虑要编译成共享对象的源代码:
int f1(void) { }
int f2(void) { f1(); }
如果用 gcc-O2 -shared -fpic
编译和 linked,有一个 R_X86_64_JUMP_SLOT
重定位:
Relocation section '.rela.plt' at offset 0x510 contains 1 entries:
Offset Info Type Symbol's Value Symbol's Name + Addend
0000000000201018 0000000800000007 R_X86_64_JUMP_SLOT 0000000000000670 f1 + 0
这来自 f2
中对 f1
的调用,它必须通过 PLT 才能启用插入:
0000000000000670 <f1>:
670: repz retq
672: nopl 0x0(%rax)
676: nopw %cs:0x0(%rax,%rax,1)
0000000000000680 <f2>:
680: jmpq 550 <f1@plt>
如果用 -O2 -shared -fpic -Wl,-Bsymbolic
编译和 linked,它就完全消失了,因为 link 编辑器能够解析引用并使用直接跳转到 f1
:
0000000000000650 <f1>:
650: repz retq
652: nopl 0x0(%rax)
656: nopw %cs:0x0(%rax,%rax,1)
0000000000000660 <f2>:
660: jmpq 650 <f1>
没有自动将 PLT 放回共享对象的方法。
我认为“-Bsymbolic”选项在共享对象的 ELF 动态符号 table 中添加了一个标志。
有没有什么方法可以使用像 objcopy 这样的工具来删除这个标志,让它表现得像一个没有“-Bsymbolic”标志的共享对象?我将无法重新构建使用上述标志构建的库。
更多信息:
- 编译器:gcc
- 平台:手臂linux
不,-Bsymbolic
无法撤消。原因是 link 编辑器应用了消除某些重定位的放宽。例如,考虑要编译成共享对象的源代码:
int f1(void) { }
int f2(void) { f1(); }
如果用 gcc-O2 -shared -fpic
编译和 linked,有一个 R_X86_64_JUMP_SLOT
重定位:
Relocation section '.rela.plt' at offset 0x510 contains 1 entries:
Offset Info Type Symbol's Value Symbol's Name + Addend
0000000000201018 0000000800000007 R_X86_64_JUMP_SLOT 0000000000000670 f1 + 0
这来自 f2
中对 f1
的调用,它必须通过 PLT 才能启用插入:
0000000000000670 <f1>:
670: repz retq
672: nopl 0x0(%rax)
676: nopw %cs:0x0(%rax,%rax,1)
0000000000000680 <f2>:
680: jmpq 550 <f1@plt>
如果用 -O2 -shared -fpic -Wl,-Bsymbolic
编译和 linked,它就完全消失了,因为 link 编辑器能够解析引用并使用直接跳转到 f1
:
0000000000000650 <f1>:
650: repz retq
652: nopl 0x0(%rax)
656: nopw %cs:0x0(%rax,%rax,1)
0000000000000660 <f2>:
660: jmpq 650 <f1>
没有自动将 PLT 放回共享对象的方法。