c - 生成的符号名称具有额外的前导下划线

标签 c name-mangling

我在 Windows 中设置了 MinGW 编译器。并进行项目设置,其中一些第三方 *.a 文件直接从 Linux 计算机复制。

尝试编译一个简单的 C 程序,当我查看 *.o 文件的符号表时,它的所有符号名称都有前导下划线。

示例程序:

int main(int argc, char** argv) 
{   
     int xyz=0; 
     printf("I am Here\n");
}

符号表条目:

Sections:

Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000040  00000000  00000000  0000008c  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000000  2**2
                  ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000000  2**2
                  ALLOC

SYMBOL TABLE:

[  0](sec -2)(fl 0x00)(ty   0)(scl 103) (nx 1) 0x00000000 abcd01.c
File
[  2](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000b **_main**
[  3](sec  1)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .text
AUX scnlen 0x3e nreloc 4 nlnno 0
[  5](sec  2)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .data
AUX scnlen 0x0 nreloc 0 nlnno 0
[  7](sec  3)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .bss
AUX scnlen 0x0 nreloc 0 nlnno 0
[  9](sec  0)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x00000000 ___main
AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0
[ 11](sec  0)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __alloca
[ 12](sec  0)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00000000 **_printf**

RELOCATION RECORDS FOR [.text]:

OFFSET   TYPE              VALUE
00000020 DISP32            __alloca
00000025 DISP32            ___main
00000033 dir32             .text
00000038 DISP32            **_printf**

这里甚至基本 C 函数都带有下划线。

尝试使用-fno-leading-underscore,但没有用。

MingW版本:

$ gcc -v
Reading specs from C:/PROGRA~1/GNUCFO~1//ncbin/../lib/gcc-lib/i386-pc-mks/3.3.1/
specs
Configured with: configure --prefix=/usr/gnu i386-pc-mks --enable-languages=c,c+
+ --disable-nls --disable-shared --enable-sjlj-exceptions --enable-threads --dis
able-win32-registry
Thread model: win32
gcc version 3.3.1 (mingw special 20030804-1)

最佳答案

您可能不想尝试使用*.a 文件(或其中的*.o 文件) Linux下生成。

这些东西是针对 Linux 环境编译的,您几乎肯定会发现 CygWin 中的 ABI(应用程序二进制接口(interface))是不同的。

CygWin 为您提供了类似于 Linux 的编程环境,以便您可以编译几乎相同的代码。从这个意义上说,它在 API(应用程序编程接口(interface))层兼容,不一定在 ABI 层兼容。

关于c - 生成的符号名称具有额外的前导下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16272994/

相关文章:

c - OpenCL 内核执行速度比单线程慢

c - 有什么可以更改 GCC 中的导出名称修改方案吗?

python - python中的私有(private)公共(public)保护访问说明符

c++ - C 和 C++ 之间的联系有何不同?

c++ - MSVC 名称修改

c - c中减少字符串长度,错在哪里?

c - 插入链表

c - for 循环用三个变量初始化

visual-c++ - 创建一个MinGW可以链接的MSVC库

c - 扩展一个 IPv6 地址,以便我可以将它打印到标准输出