Обновление общего объекта ELF, созданного с помощью опции компоновщика "-Bsymbolic" - PullRequest
0 голосов
/ 19 февраля 2019

Я считаю, что опции "-Bsymbolic" добавляют флаг в таблицу динамических символов ELF общего объекта.

Есть ли способ удалить этот флаг, используя такие инструменты, как objcopy, заставить его вести себя как общий объект, созданный без флага "-Bsymbolic"?Я не смогу пересобрать библиотеку, созданную с указанным флагом.

Дополнительная информация:

  • Компилятор: gcc
  • Платформа: arm linux

1 Ответ

0 голосов
/ 19 февраля 2019

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

...