Скомпилируйте модуль ядра как независимый от позиции исполняемый файл - PullRequest
0 голосов
/ 27 сентября 2019

Для PoC ( context ) я пытаюсь собрать модуль ядра как независимый от позиции исполняемый файл.

В настоящее время я компилирую свой модуль, используя mcmodel=small -fpie -mno-red-zone -mnosse для моего Makefile(/lib/modules/$(uname -r)fixed/build/Makefile), а затем я разрешаю свои символы, анализируя /proc/kallsyms и исправляя мой двоичный файл, используя ld параметр --defsym symbol=address

Но это не является удовлетворительным.Я получаю относительную адресацию, но не получил / plt.Ниже приведен пример функции в сгенерированном модуле до связывания

0000000000000024 <vm_close>:
{
  24:   ff 15 00 00 00 00       callq  *0x0(%rip)        # 2a <vm_close+0x6>
    printk(KERN_INFO "vm_close");
  2a:   48 8d 3d 00 00 00 00    lea    0x0(%rip),%rdi        # 31 <vm_close+0xd>
  31:   e8 00 00 00 00          callq  36 <vm_close+0x12>
}
  36:   c3                      retq  

И та же функция после перемещения

0000000000401024 <vm_close>:
{
  401024:   67 e8 d6 07 60 81       addr32 callq ffffffff81a01800 <__fentry__>
    printk(KERN_INFO "vm_close");
  40102a:   48 8d 3d da 0f 00 00    lea    0xfda(%rip),%rdi        # 40200b <myexit+0xbf5>
  401031:   e8 db 7b d4 80          callq  ffffffff81148c11 <printk>
}
  401036:   c3                      retq   

Здесь функция напрямую вызывает printk и не использует глобальнуютаблица смещения.Как мне изменить метод компиляции / компоновки, чтобы мой модуль был на самом деле построен как круговая диаграмма?

Вы можете найти параметры компиляции * .ko там (make V=1)

Примечание: я прекрасно понимаю, что мой PoC очень необычный и может быть плохой практикой, но я все равно хотел бы сделать это.

...