position-independent-code相关内容
我有一个适用于x86_64的兼容Multiboot2的ELF文件,其中开始符号在start.asm中定义,这是一个NASM程序集文件。Multiboot2标头包含relocatable标记。 由于GRUB不支持Multiboot2+a可重定位ELF(至少在2021年7月[3]),我希望自己解决一些重定位问题以解决此问题,并只加载静态ELF。 为此,我需要在运行时在我的第一个条目符号(在EL
..
ADRP PC 相对偏移处的 4KB 页面地址. ADRL 将相对于 PC 的地址加载到寄存器中.它类似于 ADR操作说明.ADRL 可以加载比 ADR 更广泛的地址,因为它会生成两条数据处理指令. 具体来说, ADRL 汇编成两条指令,一条是 ADRP,然后是 ADD.如果汇编器不能用两条指令构造地址,它产生重定位.然后链接器生成正确的偏移量.ADRL 产生与位置无
..
首先我尝试对其进行逆向工程: printf '#include int main() {puts("你好世界");}' >主文件gcc -std=c99 -pie -fpie -ggdb3 -o pie main.c回声 2 |须藤三通/proc/sys/kernel/randomize_va_spacereadelf -s ./pie |grep -E 'main$'gdb -batch -n
..
它将如何更改代码,例如函数调用? 解决方案 PIE 是支持地址空间布局随机化(ASLR) 在可执行文件中. 在创建 PIE 模式之前,程序的可执行文件无法放置在内存中的随机地址,只能将位置无关代码 (PIC) 动态库重新定位到随机偏移量.它的工作方式与 PIC 为动态库所做的工作非常相似,不同之处在于没有创建过程链接表 (PLT),而是使用了与 PC 相关的重定位. 在 gcc
..
ADRP 相对于 PC 偏移的 4KB 页地址. ADRL 将与 PC 相关的地址加载到寄存器中.它类似于 ADR操作说明.ADRL 可以加载比 ADR 更广泛的地址范围,因为它生成两个数据处理指令. 具体来说, ADRL 汇编为两条指令,一条 ADRP 后跟 ADD.如果汇编器不能用两条指令构造地址,它产生重定位.然后链接器生成正确的偏移量.ADRL 产生与位置无关
..
ADRP 相对于 PC 偏移的 4KB 页地址. ADRL 将与 PC 相关的地址加载到寄存器中.它类似于 ADR操作说明.ADRL 可以加载比 ADR 更广泛的地址范围,因为它生成两个数据处理指令. 具体来说, ADRL 汇编为两条指令,一条 ADRP 后跟 ADD.如果汇编器不能用两条指令构造地址,它产生重定位.然后链接器生成正确的偏移量.ADRL 产生与位置无关
..
考虑这个用于 AMD64 Linux 的 GNU 汇编程序: .globl _start_开始:movl $59, %eax # SYS_execveleaq .pathname(%rip), %rdi # 位置无关寻址leaq .argv(%rip), %rsimovq (%rsp), %rdx泄漏 16(%rsp,%rdx,8), %rdx系统调用movl $60, %eax # SYS_e
..
我需要获取正在运行的进程内部堆栈的基地址.这将使我能够打印将由addr2line理解的原始堆栈跟踪(已剥离运行二进制文件,但addr2line可以访问符号).我通过检查 argv [0] 的elf标头成功做到了这一点:我读取了入口点,并从& _start : 减去了它 #include#include#include#inc
..
我有一个正在建立的图书馆.当我运行以下任一程序时,我的所有对象都会依次编译并链接: ar rcs lib/libryftts.a $^ gcc -shared $^ -o lib/libryftts.so 在我的Makefile中.我也能够成功将它们安装到/usr/local/lib 当我用nm测试文件时,所有功能都在那里. 我的问题是当我运行gcc testing/test.c -l
..
我正在尝试在带有标志-fno-pie且不包含标志的gcc中编译伪函数. void dummy_test_entrypoint() { } 当我在没有标志的情况下进行编译. gcc -m32 -ffreestanding -c test.c -o test.o 我得到以下反汇编代码. 00000000 : 0: 55
..
我想在Linux上编译以下程序: .global _start .text _start: mov $1, %rax mov $1, %rdi mov $msg, %rsi mov $13, %rdx syscall mov $60, %rax xor %rdi, %rdi syscall msg:
..
考虑下面的函数: extern void test1(void); extern void test2(void){ test1(); $ b 这是gcc生成的代码,没有 -fpic on amd64 Linux: test2: jmp test1 当我使用 -fpic 进行编译时,gcc通过PLT显式调用以启用符号interposi
..