Какой флаг компоновщика Clang / G CC следует использовать для создания смещений в коде, которые остаются в пределах двоичного диапазона? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь связать свой код с внешней библиотекой stati c, в которой есть этот фрагмент кода в двоичном виде: смещение вместо нулей:

00000000000175c0 <some_method>:
   175c0:       48 8d 05 39 aa 20 00    lea    0x20aa39(%rip),%rax        # 222000 <some_method.method>
   175c7:       c3                      retq 

Смещение 222000 должно быть в разделе .data в соответствии с выводом readelf, который должен быть в порядке, но проблема в том, что мне нужно скопировать свой двоичный файл код «как есть» в некотором пространстве памяти и запускать его оттуда, без использования каких-либо загрузчиков ОС, которые знают, как перемещать различные разделы двоичного файла в адресном пространстве процесса. Адрес памяти, в который я загружаю свой двоичный файл, также может измениться, поэтому я также не могу использовать не относительные смещения stati c в моем коде.

Я хочу, чтобы все мои относительные смещения RIP в коде находились только в диапазоне размера двоичного файла, поэтому, например, если размер моего двоичного файла составляет 0x10000 байтов, и я загружаю его по адресу 0x200000, я не хотите любые смещения до go за пределами адреса 0x210000. Есть ли способ каким-то образом указать компоновщику это сделать?

...