我正在为一台无虚拟内存(或者更准确的说,没有操作系统)的机器编写C程序,并且在.rodata部分上遇到了一些困难,或者更准确地说是放在那里的东西。问题在于,尽管这些部分在链接过程中被定位在明确定义的地址处,但当程序执行时,它们会被重定位。
例如:假设我的程序从0x1000开始链接,在执行时,应该在0x1000处的内容将被重定位到0xff1000。
就是说,我的问题是通常放在.rodata的东西是由编译器(gcc)“硬编码”的,由于重定位和gcc硬编码它们的地址以获得绝对偏移量而不是相对偏移量,我有点失去了.rodata中的这些常量。
有没有办法让.rodata常量具有相对偏移量而不是绝对偏移量呢?通过相对偏移量,我是指相对于任何活动过程寄存器的偏移量。
例如:假设我的程序从0x1000开始链接,在执行时,应该在0x1000处的内容将被重定位到0xff1000。
就是说,我的问题是通常放在.rodata的东西是由编译器(gcc)“硬编码”的,由于重定位和gcc硬编码它们的地址以获得绝对偏移量而不是相对偏移量,我有点失去了.rodata中的这些常量。
有没有办法让.rodata常量具有相对偏移量而不是绝对偏移量呢?通过相对偏移量,我是指相对于任何活动过程寄存器的偏移量。
-fPIC
选项)。代码是否总是被重定位到0xff1000
,还是会变化的? - user786653.rodata
包含只读数据,但其在内存中的位置是由定位器(通常是链接器的一部分)确定的,定位器接受指定可用内存区域的配置文件。也许您有一个配置文件指定了.rodata
不同于您想要/认为/假设的位置。不过,我需要更多详细信息。 - Johan Bezem