如何在每个符号的NASM中覆盖`--prefix`选项?

时间:2017-06-04 20:05:10

标签: c gcc nasm name-mangling linker-scripts

我正在用GCC编译C代码,并在Windows上用NASM组装一些x86代码。

现在,GCC默认情况下(我无法找到更改此选项的选项)为所有外部符号名称(和预期名称)添加下划线_

我需要这个汇编代码才能在Windows和Linux上使用GCC,并且希望尽可能地避免黑客攻击(以及代码重复;我首先为Windows / Linux创建了单独的.s文件。 / p>

我在NASM中发现了(并使用过)--prefix标志。现在对于某些符号,我希望NASM将它们视为而不使用前导下划线(现在的确切情况是我需要在没有前导下划线的链接描述文件中引用入口点)。因此,这里的问题是如何覆盖每个符号NASM的--prefix / --postfix标志。

随意将此视为XY问题。例如,如果有一种方法可以为C设置GCC的修改方案,那就很好了。

1 个答案:

答案 0 :(得分:1)

我偶然发现了同样的问题。我创建了一个包含很多定义的包含文件,比如

dialog.open(...).afterClosed().subscribe( response => {
 box.state = response
}

和其他一些东西。

该文件(libc_win32.in)包含在" master"包含文件(libc.inc):

%define printf  _printf
%define puts    _puts
%define scanf   _scanf

我设置符号并在命令行中包含文件:

%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 ... 的预定义宏,但它只能在宏内部工作,而不能在程序启动时工作。