c - .rodata 搬迁相关问题

标签 c low-level-code

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

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

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

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

最佳答案

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

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

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

希望有帮助!

关于c - .rodata 搬迁相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7090791/

相关文章:

c - 当文件包含特殊字符以控制进程时,如何将文件读入 C 中的结构

从二维数组连接字符串

c - 实现列表C

改变数组长度

Java:如何在子类中填充变量?

使用 Qemu 进行 ARM 汇编

c - 使用低级 C i/o 将从标准输入接受的整行写入文件

c - 如何使用低级 write() 函数将字符串写入文件?

c - 用c语言编程刽子手

c - 如果 (n!=0) n=0; v/s n=0;哪个更有效,为什么?