我正在使用 GCC 编译 C 代码,并在 Windows 上使用 NASM 组装一些 x86 代码。
现在,GCC 默认情况下(我无法找到更改此设置的选项)在所有外部符号名称(和预期名称)前面添加下划线
_
。
我需要这个汇编代码才能在 Windows 和 Linux 上与 GCC 一起使用,并希望尽可能避免黑客攻击(以及代码重复;我首先为 Windows/Linux 有单独的
.s
文件)。
我发现(并使用)了 NASM 中的
--prefix
标志。现在,对于某些符号,我希望 NASM 将它们视为“不带”前导下划线(现在的确切情况是我需要在不带前导下划线的情况下引用链接器脚本中的入口点)。因此,这里的问题是如何覆盖每个符号 NASM 的 --prefix
/--postfix
标志。请随意将此视为 XY 问题。例如,如果有一种方法可以为 C 设置 GCC 的修改方案,那就太好了。
%define printf _printf
%define puts _puts
%define scanf _scanf
还有其他一些东西。
该文件 (libc_win32.in) 包含在“主”包含文件 (libc.inc) 中:
%ifndef LIBC_INC
%define LIBC_INC
%ifdef win32
%include 'libc_win32.inc'
%elifdef win64
%include 'libc_win64.inc'
%elifdef elf32
%include 'libc_elf32.inc'
%elifdef elf64
%include 'libc_elf64.inc'
%else
; %error "libc.inc"
%endif
%endif
我设置了符号并在命令行中包含文件:
nasm -fwin32 -dwin32 -plibc.inc ...
或
nasm -felf32 -delf32 -plibc.inc ...
有一个名为
__OUTPUT_FORMAT__
的预定义宏,但它仅在宏内部起作用,而不是在程序启动时起作用。
的解决方案针对 Windows 进行编译时,使用选项:
nasm -fwin32 --prefix _ file.asm -o file.exe
.asm 文件中的所有函数名称都将在前面添加
_
下划线字符,包括全局函数和外部函数
如果您使用Makefile
,只需检测我们是否在Windows上并使用前缀选项:
ifeq ($(OS),Windows_NT)
FORMAT = win32
PREFIX =--prefix _
else
FORMAT = elf32
PREFIX =
endif
#...
# When compiling...
my_binary:
nasm $(PREFIX) -f $(FORMAT) file.asm -o [email protected]