使用gcc手动定义外部符号

时间:2013-08-18 16:10:59

标签: windows gcc linker ld dll-injection

我在视频游戏中使用DLL注入来进行修改(我正在构建游戏API)。

我想从我的新DLL直接访问EXE中的结构和变量。变量的绝对地址是已知的(EXE具有固定的图像库)。

根据GNU ld文档,我可以使用--defsym=symbol=expression在输出文件中创建一个全局符号,其中包含表达式给出的绝对地址。

我无法让它发挥作用。

如果我在代码中将符号声明为extern,并使用ld --defsym,则会得到未定义的引用错误。但是,如果我在代码中定义符号,它只使用本地(DLL)版本,而不是EXE版本。

似乎--defsym选项无效。任何见解将不胜感激。

更新:--defsym在Linux下完美运行。当我尝试使用mingw在Windows上进行编译时,出现undefined reference错误。

1 个答案:

答案 0 :(得分:1)

我已经发现了问题。

在检查mingw生成的程序集后,我发现C符号名称以下划线为前缀。这种情况发生在Windows上,但不发生在Linux上。

有一个gcc选项-fno-leading-underscore,但这会导致对WinMain的未定义引用。

只需将前导下划线添加到符号名称即可。

示例:如果我的符号在C中名为alien,则使用gcc --defsym=_alien=0x500000可以正常工作。