我在视频游戏中使用DLL注入来进行修改(我正在构建游戏API)。
我想从我的新DLL直接访问EXE中的结构和变量。变量的绝对地址是已知的(EXE具有固定的图像库)。
根据GNU ld
文档,我可以使用--defsym=symbol=expression
在输出文件中创建一个全局符号,其中包含表达式给出的绝对地址。
我无法让它发挥作用。
如果我在代码中将符号声明为extern
,并使用ld --defsym
,则会得到未定义的引用错误。但是,如果我在代码中定义符号,它只使用本地(DLL)版本,而不是EXE版本。
似乎--defsym
选项无效。任何见解将不胜感激。
更新:--defsym
在Linux下完美运行。当我尝试使用mingw在Windows上进行编译时,出现undefined reference
错误。
答案 0 :(得分:1)
我已经发现了问题。
在检查mingw
生成的程序集后,我发现C符号名称以下划线为前缀。这种情况发生在Windows上,但不发生在Linux上。
有一个gcc
选项-fno-leading-underscore
,但这会导致对WinMain
的未定义引用。
只需将前导下划线添加到符号名称即可。
示例:如果我的符号在C中名为alien
,则使用gcc --defsym=_alien=0x500000
可以正常工作。