我无法弄清楚如何在汇编中计算符号的RVA。 (RVA =相对虚拟地址=从可执行映像的开始偏移量)
如果我写下以下内容,
rva:
.long symbol
symbol:
.long <whatever>
'rva'的值最终是符号的实际虚拟地址,因为汇编程序当然会为它发出修正记录。如果有一个符号对应于图像的开头,我可以写'symbol - image_base',但据我所知,没有...
答案 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程序应该非常简单。