Windows 如何使用汇编器(或链接器)定义等于外部符号的公共符号?
在代码生成场景中,我希望发出汇编代码(Microsoft toolchain,所以MASM表示64位或32位),这样我就可以定义一个Windows 如何使用汇编器(或链接器)定义等于外部符号的公共符号?,windows,assembly,linker,code-generation,masm,Windows,Assembly,Linker,Code Generation,Masm,在代码生成场景中,我希望发出汇编代码(Microsoft toolchain,所以MASM表示64位或32位),这样我就可以定义一个PUBLIC符号,该符号将与一些EXTERN符号具有相同的值-换句话说,有点“转发”符号定义。然后,这个想法是链接器将解决问题,这样任何使用PUBLIC符号的行为实际上都会引用EXTERN符号的值。当然,EXTERN符号应该在其他一些对象文件中定义 作为一个具体的例子,考虑到我有一个对象文件属于一个库,它的外部函数是一个符号到>代码>,这是某个函数的地址。现在假设我
PUBLIC
符号,该符号将与一些EXTERN
符号具有相同的值-换句话说,有点“转发”符号定义。然后,这个想法是链接器将解决问题,这样任何使用PUBLIC
符号的行为实际上都会引用EXTERN
符号的值。当然,EXTERN
符号应该在其他一些对象文件中定义
作为一个具体的例子,考虑到我有一个对象文件属于一个库,它的外部函数是一个符号<代码>到>代码>,这是某个函数的地址。现在假设我有一个C头,它声明了一个带有正确签名的函数
From
。我的目标是一个“等同”的汇编语言文件From
和到
,这样当包含从调用的函数的文件与包含到
的目标文件以及来自此汇编语言的目标文件链接在一起时,链接器将进行设置,以便调用函数到
我目前正在通过生成JMP
语句来实现这一点,例如:
PUBLIC From
EXTERN To
_TEXT SEGMENT
From:
JMP To
_TEXT ENDS
就其本身而言,这工作正常,但出于某些目的,我不希望通过JMP
-指令来执行,而是希望从
调用,实际上是调用到
。例如,我希望能够从
获取的地址,并获取到
的第一个字节的地址,而不是JMP
指令
(如果我不能通过MASM来完成,那么也许我可以使用某种指令链接文件来完成?或者,我可以使用除MASM之外的另一个汇编器来完成,或者使用不同的工具链来完成,最好是针对Windows,而不是针对Linux?)
(我想我应该提一下
PUBLIC From
EXTERN To
From EQU Bar
不工作:错误A2014:无法定义为公共或外部:从
)出于好奇,为什么模块不能直接使用到
?< <代码> > <代码>是否需要在其他模块中“被外加”?它不是在定义中的吗?@ Lurk.我试图得到一个工具,它在特定的意义上,在编译时,与另一C++类C++相匹配(与运行代理时的运行时间相反)。在某些情况下,目标类是直接可用的,在这种情况下,我希望代理上的方法调用直接对目标的方法进行。在编译目标类'.cpp时,C++编译器已经删除了我正在查看的方法名称。我认为<>代码>的代码/代码>的缺点是它在汇编时解决了所有问题,但是直到链接时间,<>代码> < /> >将无法解决。我现在还没有一个答案,但不知何故,这(我认为)需要引导链接器(正如您在对链接的引用中所暗示的那样)允许同一入口点/标签使用另一个符号。您现在所做的重击可能是在程序集级别所能做的最好的。您可能已经看过了,但是您可以看看链接器.def
文件的指令。特别是func2=func1
选项。如果导出的唯一符号是别名,这可能会起作用,但如果您需要同时导出原始的到
和从
导出,那么它可能不允许这样做。