3

我正在尝试为没有虚拟内存(或者更准确地说是操作系统)的机器编写一个 C 程序,并且我在 .rodata 部分,或者更准确地说是那里的东西遇到了一些困难。出现的问题是,尽管在链接期间这些节位于明确定义的地址,但当程序开始执行时,它正在被重新定位。

例如:假设我的程序开始链接到从 0x1000 开始,当它被执行时,应该在 0x1000 的内容被重新定位在 0xff1000。

话虽这么说,我的问题是,通常进入 .rodata 的内容是由编译器(gcc)“硬编码”的,并且由于重定位和 gcc 对它们的地址进行硬编码,我有点丢失了内存中的 .rodata 常量,因此它们获得绝对偏移量而不是相对偏移量。

有没有一种方法可以让 .rodata 常量具有相对偏移量而不是绝对偏移量。相对,我的意思是相对于任何活动的进程寄存器?

4

1 回答 1

1

根据架构,.rodata 可能会被任意重定位到特定的内存区域(例如 ROM)。此类信息可在您的机器数据表中找到。如果是这种情况,您必须使用链接描述文件告诉链接将您的 .rodata 部分放在正确的区域中。可以在此处找到有关 GCC 链接器脚本如何工作的一个很好的概述:

http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html

此外,您可以在 Internet 上轻松找到许多特定于体系结构的链接脚本。

希望有帮助!

于 2013-01-24T13:36:17.900 回答