【问题标题】:Manually defining external symbols with gcc使用 gcc 手动定义外部符号
【发布时间】:2013-08-18 16:10:59
【问题描述】:

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

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

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

我无法让它工作。

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

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

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

【问题讨论】:

    标签: windows gcc linker ld dll-injection


    【解决方案1】:

    我已经解决了问题。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2017-04-02
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      相关资源
      最近更新 更多