【发布时间】:2017-07-19 11:54:48
【问题描述】:
有没有办法改变所有常量指针的目标部分?对我来说,带有 'attibute' 的选项不行,因为我需要一些不更改源代码就无法工作的解决方案。
这里的例子:
char * myString = "Some string to print";
正如我们所知,myString 存储在 .data 中并指向 .rodata。系统将在应用程序启动期间通过从 elf 文件中复制它来初始化它。但这只是原始数据,无法分析。问题是,当我们没有 MMU 时,我们尝试使用 -fPIC 和 .got,指针不使用 .got,所以它是不正确的。
【问题讨论】:
-
“我需要一些不改变源代码就无法工作的解决方案” 你确定吗?猜测您“我需要一些无需更改源即可工作的解决方案”。
-
也许可以尝试编写自定义linker script
-
像这样初始化的全局指针变量需要在 PIC 代码中重新定位。我认为没有办法解决这个问题,因此您需要禁用 PIC 代码或编写一些执行所需重定位的微小动态链接器。
-
实际上,我在自己的为嵌入式架构设计的操作系统中使用自己的链接器脚本 (chocoos.org)。我想在其中运行 ELF 文件。一般来说它可以工作,但问题是我没有 MMU,所以我必须使用 -fPIC。该程序已构建并放入 SD 卡中。系统分析 ELF 文件,读取程序部分,并更新它。尽管存在这种情况,但当全局指针初始化为 .rodata 部分时,这仍然有效。我知道,我可以将变量放到不同的部分,并更新部分,但我不想更改程序的源代码
-
否则每次要为系统构建程序时,都必须更新所有全局变量。例如,如果你想构建 gcc,它会花费太多时间
标签: c pointers gcc linker constants