更新使用“ -Bsymbolic”链接器选项生成的ELF共享库

时间:2019-02-19 07:10:04

标签: c gcc shared-libraries elf

我相信“ -Bsymbolic”选项会在共享库的ELF动态符号表中添加一个标志。

是否可以使用objcopy之类的工具删除此标志,使其表现为没有“ -Bsymbolic”标志的共享对象?我将无法重新构建使用所述标记构建的库。

更多信息:

  • 编译器:gcc
  • 平台:arm linux

1 个答案:

答案 0 :(得分:1)

否,-Bsymbolic无法撤消。原因是链接编辑器应用了松弛,从而消除了某些重定位。例如,考虑将以下源代码编译成共享对象:

int f1(void) { }
int f2(void) { f1(); }

如果已编译并与gcc-O2 -shared -fpic链接,则将发生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

这来自对f1中的f2的调用,该调用必须经过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链接,则完全消失了,因为链接编辑器能够解析引用并直接跳转到f1

0000000000000650 <f1>:
 650:   repz retq
 652:   nopl   0x0(%rax)
 656:   nopw   %cs:0x0(%rax,%rax,1)

0000000000000660 <f2>:
 660:   jmpq   650 <f1>

没有自动方法将PLT放回共享库中。