我正在使用基于 cortex-A8 的 S5PV210。它以初始化开始,然后跳转到 SDRAM 的 0x20000000 并运行我的代码。所以我只需要将我的主要功能放在0x20000000上。
据我所知,有两种方法可以做到。第一种是使用 -Ttext=0x20000000 使 .text 从 0x20000000 开始。第二个是使用 -fpie -pie 生成与位置无关的代码。我正在使用后者。
它大部分时间都有效,但我陷入了我的一个项目。症状是 printf("123") 将打印永久的混乱代码并且永远不会返回。如果我切换回使用 -Ttext=0x20000000,那么它会正常工作。
我已经尝试了一些步骤来分析它:
更改我的主函数只需调用一个 printf 以便我的代码不会调用任何其他函数,如下所示:
int main(){ printf("123"); 而(1);返回0;}
因为 -fpie -pie 大部分时间都很好用,所以我开始注释一些其他功能,最后发现如果我注释了足够多的代码,printf 将再次起作用。
现在我很困惑,-fpie 和 -pie 真的有效吗?