如何在装配中计算符号RVA?

时间:2013-12-29 10:47:47

标签: assembly

我无法弄清楚如何在汇编中计算符号的RVA。 (RVA =相对虚拟地址=从可执行映像的开始偏移量)

如果我写下以下内容,

rva:
    .long symbol

symbol:
    .long <whatever>

'rva'的值最终是符号的实际虚拟地址,因为汇编程序当然会为它发出修正记录。如果有一个符号对应于图像的开头,我可以写'symbol - image_base',但据我所知,没有...

1 个答案:

答案 0 :(得分:2)

在目标文件中有一个重定位类型IMAGE_REL_I386_DIR32NB,允许这样的表达。

然而,在GNU工具链中,使用这些重定位类型(windres和dlltool)的工具直接写出目标文件而不是汇编文件。

因此我认为(但我不确定)没有可能在汇编程序中编写这样的表达式(GNU和Microsoft工具链)。

然而,有两种可能解决这个问题:

1)修改了一个定义特殊符号的链接描述文件(例如符号“RVA_of_myVariable”)

2)将此类型的所有符号(仅限此类符号)写入单独的汇编程序文件,并将生成的目标文件中类型6的所有重定位更改为重定位类型7(对于32位文件;键入1/2以类型3为64位文件)。可以很容易地解析COFF目标文件格式,因此编写执行这些更改的C程序应该非常简单。