【问题标题】:how to export symbols in NASM如何在 NASM 中导出符号
【发布时间】:2016-05-10 05:24:20
【问题描述】:

我的函数不是由 NASM 汇编器导出的,因此我无法将它与我的 C 程序链接。我正在使用手册中所说的export 指令,但无法识别。怎么了?这是我的做法:

[niko@dev1 test]$ cat ssefuncs.S 
use64
section .data
NEW_LINE_4_SSE  db  '1111111111111111'

section .text

export find_nl_sse

find_nl_sse:
    mov rax,NEW_LINE_4_SSE
    movntdqa xmm0,[esi]
    pcmpestri xmm0,[rax],0x0

    ret

[niko@dev1 test]$ nasm -f elf64 -o ssefuncs.o ssefuncs.S
ssefuncs.S:7: error: parser: instruction expected
[niko@dev1 test]$ 

如果我省略了export,重新编译程序集并尝试链接,生成的代码将不会与我的 C 程序链接:

[niko@dev1 test]$ gcc -o bench3 ssefuncs.o bench3.o
bench3.o: In function `main':
/home/niko/quaztech/qstar/test/bench3.c:34: undefined reference to `find_nl_sse'
collect2: error: ld returned 1 exit status
[niko@dev1 test]$ 

我也尝试添加 global 指令,但我得到了同样的错误。为什么 NASM 文档如此具有误导性?

【问题讨论】:

  • 我有两个想法:1. 尝试将export find_nl_sse 移动到section .text 之前,也可以尝试使用global 而不是export。 2. 在 asm 中将其命名为 _find_nl_sse,在 C 中命名为 find_nl_sse
  • globalexport 做不同的事情。
  • @MarinovIván ,它没有帮助。将导出/全局移出 .text 部分后出现同样的错误

标签: gcc assembly nasm x86-64


【解决方案1】:

这是将标签定义为在当前装配单元之外可见的正确方法。

global _main 
_main: 
  1. global 语句必须在实际标签之前
  2. 标签必须以下划线开头

C 文件会将标签引用为

extern _main

【讨论】:

  • 正确,只是我不能使用 _main,我的 C 程序中有“main”符号。但它有效。谢谢。我认为“标签前”和删除“导出”是成功编译的关键
  • 至于下划线,当使用 ELF 对象时,不需要前导下划线,除非你明确地用-fleading-underscore覆盖它
  • @MichaelPetch 但是在 Mac 上,你总是需要下划线。
  • @JustinC.B.:我说的是 ELF,不是 MACHO。 ELF 不需要下划线。如果您在 MacOS 上使用 x86 ELF 交叉编译器,则不需要下划线。如果您生成 MACHO 对象(32 位或 64 位),那么您就可以。应该指出 OP 正在使用 ELF。
  • @MichaelPetch 这很合理,我只是指出,如果您使用的是 MACHO,您实际上需要下划线。
猜你喜欢
  • 2018-06-12
  • 2017-11-05
  • 1970-01-01
  • 2011-12-27
  • 2013-06-26
  • 2016-01-24
  • 1970-01-01
  • 2012-02-06
  • 2020-12-23
相关资源
最近更新 更多