Скомпилировать модуль ядра как независимый от позиции исполняемый файл
Для PoC ( контекста) я пытаюсь создать модуль ядра как независимый от позиции исполняемый файл.
В настоящее время я компилирую свой модуль, используя mcmodel=small -fpie -mno-red-zone -mnosse
в мой Makefile (/lib/modules/$(uname -r)fixed/build/Makefile
), а затем я разрешаю свои символы, анализируя /proc/kallsyms
и исправление моего двоичного файла с помощью ld
вариант --defsym symbol=address
Но это не удовлетворительно. Я получаю относительную адресацию, но не got / 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 очень необычен и может быть плохой практикой, но я все равно хотел бы это сделать.