【问题标题】:How can I create a static library in nasm and link with gcc?如何在 nasm 中创建静态库并与 gcc 链接?
【发布时间】:2012-02-01 16:36:48
【问题描述】:

我想在(32 位)NASM 中实现一些具有以下签名的函数:

int function1();
int function2();

等等。

然后我想创建一个目标文件并能够将它与使用 gcc 编译的 C++ 程序静态链接。我正在寻找一个返回 int 的函数的示例实现、导出符号所需的任何附加代码以及 NASM 的命令行以生成我可以静态链接到的 .a 文件。提前致谢。

【问题讨论】:

  • 我认为 NASM 不会生成 .a 文件,但您可以使用 ar 轻松地从 .o 制作一个。而且您不一定需要 .a 文件来链接;您可以直接链接 .o 文件。所以我想你只需要知道如何编写汇编函数来兼容 gcc 调用约定。您可能希望在您的原型上使用extern "C"。这是一个可能有帮助的链接wiki.osdev.org/C%2B%2B_to_ASM_linkage_in_GCC

标签: c++ gcc static-libraries nasm


【解决方案1】:

Assembler 将输出一个目标文件,仅在链接时使用它(我不记得 NASM 选项,所以不要逐字尝试这个 - 类似于 nasm foo.asm -o foo.o; g++ -o prog foo.o bar.cpp)。

静态库只不过是对象文件的精美存档(因此是 .a 扩展名)。 binutils 有 ar 实用程序,如果您真的想将单个对象打包到存档中。

【讨论】:

  • 如何导出函数(从 nasm 代码),以便可以将它们用作 extern "C" 声明?
  • @TamásSzelei:阅读 NASM 文档,我不记得了。此外,无论如何,在汇编中编写任何东西都可能是个坏主意。
  • 这就是我问这个问题的原因。我在文档中找不到相关部分。并感谢您的建议,指出。我有理由这样做(这不是性能)。
  • @TamásSzelei: nasm.us/doc/nasmdoc6.html#section-6.6 还要阅读 cdecl 调用约定。
  • 谢谢。我实际上无法链接生成的 COFF 对象 (-f coff),但我尝试了 FASM,它产生的“MS COFF”格式(奇怪的是)可以被 ld 链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2011-02-08
相关资源
最近更新 更多