assembly - 在古代 NASM 版本 (0.98.39) 中,常见符号报告为 'redefined'

标签 assembly x86 nasm symbols redefinition

我正在尝试使用 NASM 0.98.39 编译此源代码(已精简到最低限度):

common foo 2:near
mov word [bx], foo
dummy:

意外地,我收到错误消息:

$ nasm-0.98.39 -O9 -f obj -o tt.obj tt.nasm  
tt.nasm:1: error: symbol `foo' redefined

较新版本的 NASM(例如 2.13.02)成功。

有没有办法让它与 NASM 0.98.39 一起工作?

请注意,对于生产项目,升级 NASM 不是一个选项,因为较新的版本在某些特殊情况下会生成不同的机器代码。

请注意,将优化标志从 -O9 更改为 -O0 可以使其成功,但这不是生产项目的选项。

最佳答案

Is there a way to make it work with NASM 0.98.39?

不,没有。 当然,您可以升级 nasm

,这是一个相当快速且肮脏的解决方案
  • 尝试解决优化中不需要的偏差(插入严格),或
  • 只需以 db 表示法转储所需的机器代码即可。

Yes, I'd be happy with a workaround.

OMF 是一种相当简单的数据格式。 您可以在不到一小时的时间内阅读所有必要的文档,并在一天内编写补丁程序。 然后,您将在 nasm 源代码中使用 extern 代替 common,您的补丁程序将修复此问题。

关于assembly - 在古代 NASM 版本 (0.98.39) 中,常见符号报告为 'redefined',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75300794/

相关文章:

linux nasm 程序集 dwtoa

从汇编代码调用库中的 C 函数

assembly - PowerPC 上有屏蔽混合指令吗?

assembly - 无法解析的外部符号_WinMainCRTStartup

assembly - 理解汇编语言的多种指令时遇到的问题

linux - ldd 在 x86 Linux 上显示不同的地址

c - 非特权用户运行 C/asm 程序会对 Linux 造成什么危害?

x86 - _mm512_load_epi32 和 _mm512_load_si512 有什么区别?

assembly - "Accessing a corrupted shared library"

assembly - 相同的汇编指令但不同的机器指令