问题描述
我尝试将 newlib GCC 库编译为 -fpic 但失败了,因为 impure_ptr
和 impure_dat
仍在最终二进制文件中进行硬编码。
不是 PIC 的看跌期权片段(显然):
00021f9c 10 b5 push { r4,lr }
00021f9e 05 4b ldr r3,[DAT_00021fb4] = 0001ACA6h
00021fa0 05 4a ldr r2,[DAT_00021fb8] = 00000744h
00021fa2 7b 44 add r3,pc
00021fa4 9b 58 ldr r3=>_impure_ptr,[r3,r2]=>->_impure_ptr = 0004c2cc
= 0004c734
00021fa6 01 00 mov r1,r0
00021fa8 18 68 ldr r0=>impure_data,#0x0]=>->impure_data = 0004c2cc
00021faa ff f7 75 ff bl _puts_r undefined _puts_r()
00021fae 10 bc pop { r4 }
00021fb0 02 bc pop { r1 }
00021fb2 08 47 bx r1
相同的二进制文件,但去掉了 obj 副本并放置在随机区域 (0x0e021f6c):
0e021f6c 10 b5 push { r4,lr }
0e021f6e 05 4b ldr r3,[DAT_0e021f84] = 0001AC1Eh
0e021f70 05 4a ldr r2,[DAT_0e021f88] = 00000744h
0e021f72 7b 44 add r3,pc
0e021f74 9b 58 ldr r3=>DAT_00033a60,r2]=>DAT_0e03d2d8 = 00033A60h
0e021f76 01 00 mov r1,r0
0e021f78 18 68 ldr r0,#0x0]=>DAT_00033a60
0e021f7a ff f7 75 ff bl FUN_0e021e68 undefined FUN_0e021e68()
0e021f7e 10 bc pop { r4 }
0e021f80 02 bc pop { r1 }
0e021f82 08 47 bx r1
我正在使用的环境必须是线程安全的,因此二进制文件的入口点必须是主函数,而这是用于该函数的链接器脚本(我知道这在使用转储时只包括文本部分objcopy,但是有没有办法在同一个二进制文件中添加 .bss 区域和 .data 区域?):
GROUP(
libgcc.a
libg.a
libc.a
libm.a
libnosys.a
)
ENTRY(main)
SECTIONS
{
.text :
{
*(.text.main);
*(.text*);
}
}
这是我编译newlib的方式:
../configure --target=arm-none-eabi --enable-newlib-reent-small --disable-newlib-fvwrite-in-streamio --disable-newlib-fseek-optimization --disable-newlib-wide-orient --disable-malloc-newlib-nano-malloc --disable-newlib-unbuf-stream-opt --enable-lite-exit --enable-newlib-global-atexit --enable-newlib-nano-formatted-io --disable-nls
make CFLAGS_FOR_TARGET="-fPIC -g -O2" -j16
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)