Нет, -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 в общий объект.