Для 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 очень необычный и может быть плохой практикой, но я все равно хотел бы сделать это.