链接描述文件定义的变量

问题描述

我已经开发了一段时间的程序,但最近我购买了一台新笔记本电脑,在设置了我的开发环境并提取了我的存储库的新副本后,我收到了以下两个错误。

ingw32/bin/ld.exe: target pei-x86-64 not found
collect2.exe: error: ld returned 1 exit status
mingw32-make: *** [makefile:43: Debug] Error 1

我认为这是一个简单的错误需要更正,我生成了一个新的链接器脚本并将输出格式从 OUTPUT_FORMAT(pei-x86-64) 更改为 OUTPUT_FORMAT(pei-i386)。我编译它期望一个干净的构建,但是我收到以下错误

./bin/Debug/cryptor.o:main.c:(.cryptor+0x41): undefined reference to `START_OF_PAYLOAD'
./bin/Debug/cryptor.o:main.c:(.cryptor+0x4d): undefined reference to `END_OF_PAYLOAD'

这不是我在以前的开发机器上遇到的错误,也不是我一直在调整我的项目以在其上工作的 linux 机器

我一直在使用 mingw32-make.exe 4.2.1 x86_w64-mingw32 在我的新系统上使用 mingw32-make.exe 4.2.1 i686-w64-mingw32

两个系统上的代码路径相同。这是一个 git clone 的构建

ma​​in.c

__attribute__((constructor(101),section(".cryptor"))) int construct()
{
        extern UINT64 START_OF_PAYLOAD;
        extern UINT64 END_OF_PAYLOAD;

.
.
.
}

win32linker.ld

 .cryptor BLOCK(__section_alignment__) :{
        *(.cryptor)
  }
  .payload BLOCK(__section_alignment__) : {
    START_OF_PAYLOAD = . ;
    *(.payload)


    . = ALIGN(0x200); /*minimum size of a section*/
    END_OF_PAYLOAD = . ;
  }

这两个部分是在 .text 部分之后立即定义的。如果您能帮助我诊断此问题的根本原因,我将不胜感激。文档也将不胜感激。

提前致谢

编辑

这是我使用的 GCC 标志

调试

gcc -c  $(SrcPath)/main.c  -o $(Dpath)/cryptor.o
gcc -c  ./payload/$(Payload)/client/*.c  -o $(Dpath)/payload.o $(INC)
gcc -g -T $(SrcPath)/win32Linker.ld  $(Dpath)/cryptor.o $(Dpath)/payload.o -o $(Dpath)/cryptor.exe

发布

gcc -c  $(SrcPath)/main.c  -o $(Dpath)/cryptor.o
gcc -c  ./payload/$(Payload)/client/*.c  -o $(Dpath)/payload.o $(INC)
gcc -s -static -mwindows -fvisibility=hidden -T $(SrcPath)/win32Linker.ld  $(Rpath)/cryptor.o $(Rpath)/payload.o -o $(Rpath)/cryptor.exe -lCrypt32 -lWs2_32 -lBCrypt

解决方法

我在 ld --verbose 输出中发现了修复此问题的简介。显然,问题的根源归结为名称修改

解决方案很简单,因为我只需要在链接描述文件中解决两种可能的名称修饰方案。

  .cryptor BLOCK(__section_alignment__) :{
        *(.cryptor)
  }

  .payload BLOCK(__section_alignment__) : {
        START_OF_PAYLOAD = . ;
        *(.payload)
        . = ALIGN(0x200); /*minimum size of a section*/
    END_OF_PAYLOAD = . ;
  }
  /*
   * took forever to figure this out. apparently,this is the correct way to make
   * sure the variables can be exported
   */
  _START_OF_PAYLOAD = START_OF_PAYLOAD;
  __START_OF_PAYLOAD = START_OF_PAYLOAD;
  _END_OF_PAYLOAD = END_OF_PAYLOAD;
  __END_OF_PAYLOAD = END_OF_PAYLOAD;

现在我导入的符号从 extern 变量中正确读取。下一步是强制兼容性在32位和64位架构上都正确,并且应该处于交叉编译兼容状态。


这最终成为部分解决方案

此外,我必须对头文件做一些工作并添加 search_dir 和 output_format 说明符,以使一切以合理的方式工作。这花了一些时间,但这个项目是复杂的,并且是针对多个平台而设计的。但由于这是(由于项目的性质)特定于我的项目的机制,我忽略了这些细节,但希望这个答案能解决其他人的问题!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...