【发布时间】:2022-01-04 00:15:17
【问题描述】:
假设在裸机(arm-none-eabi-gcc)arm v5 环境中,函数存储在固定位置,并且底层“应用程序”只能通过绝对地址访问函数. 所以,函数定义为:
.type name, %function; \
.extern name; \
.equ name,0x400099
可以像这样从 C 代码调用 name(args);
但是,由于共享二进制文件(编译为-fPIE)的性质,生成的单板如下:
00012294 <name_veneer>:
00012294 ldr r12,[DAT_0001229c]
00012298 add pc=>LAB_412331,pc,r12
0001229c .word 400099h
链接器将 PC 的当前位置添加到不正确的最终目标位置,而是首选如下内容:
00012294 <name_veneer>:
00012294 ldr r12,[DAT_0001229c]
00012298 mov pc,r12
0001229c .word 400099h
系统信息
- 底层应用程序在运行时有一个未知的入口点,因此需要 PIE。
- 应用程序从网络加载以进行调试。
- 包含 CPU 的 SOC 是专有设计。
【问题讨论】:
-
如果没有变通方法,它在 C 级别上是不可排序的。
-
我怀疑你遗漏了一些东西。见my answer to static linked libraries。主要是,如果不需要重新定位静态基地,为什么要使用 PIE?然后只需 PIC 或 PC 相关代码就可以了。 PIE 需要更新静态库。
-
是的,运行时处理程序在应用程序本身上运行,它将 R9 寄存器指向 GOT,然后由只能在共享二进制文件上完成的 reloc 表修复