【问题标题】:How to override `--prefix` option in NASM per symbol?如何在每个符号的 NASM 中覆盖 `--prefix` 选项?
【发布时间】:2017-11-05 14:21:37
【问题描述】:

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

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

我需要此汇编代码才能在 Windows 和 Linux 上与 GCC 一起使用,并且希望尽可能避免黑客攻击(以及代码重复;我最初为 Windows/Linux 有单独的 .s 文件)。

我发现(并使用了)NASM 中的--prefix 标志。现在对于一些符号,我希望 NASM 将它们视为 没有 前导下划线(现在的确切情况是我需要在链接器脚本中引用没有前导下划线的入口点)。因此,这里的问题是如何根据符号覆盖 NASM 的 --prefix/--postfix 标志。

请随意将此视为 XY 问题。例如,如果有办法为 C 设置 GCC 的修改方案,那就太好了。

【问题讨论】:

  • 关于“请随意将其视为 XY 问题。”。我很好奇您是否这样做是为了构建操作系统?
  • @MichaelPetch - 确实:D 我正在与其他人一起通过Little OS Book 工作,我们希望尽可能在 Windows 和 Linux 上编译相同的代码。跨度>

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2014-01-01
    相关资源
    最近更新 更多