我有一个正在建设的图书馆.当我运行以下任何一个时,我的所有对象都会连续编译和链接:
ar rcs lib/libryftts.a $^
gcc -shared $^ -o lib/libryftts.so
在我的Makefile中.我也能够成功安装它们/usr/local/lib
当我用nm测试文件时,所有的功能都在那里.我的问题是,当我跑步gcc testing/test.c -lryftts -o test && file ./test或gcc testing/test.c lib/libryftts.a -o test && file ./test
它说:
test: ELF 64-bit LSB shared object而不是test: ELF 64-bit LSB executable像我期望的那样.我究竟做错了什么?
PC相对偏移量的4KB页面地址.
将PC相关地址加载到寄存器中.它类似于ADR指令.ADRL可以加载比ADR更广泛的地址,因为它生成两个数据处理指令.
特别,
ADRL汇编为两条指令,ADRP后跟ADD.如果汇编程序无法在两条指令中构造地址,则会生成重定位.然后链接器生成正确的偏移量.ADRL生成与位置无关的代码,因为地址是相对于PC计算的.
做什么ADRP和ADRL说明做什么?更重要的是,如何与ADRP后面的ADD结构与PC相关的地址?