将 newlib 编译为 -fpic 无效

问题描述

我尝试将 newlib GCC 库编译为 -fpic 但失败了,因为 impure_ptrimpure_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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...