【问题标题】:Integrate NASM to a compiler written in C将 NASM 集成到用 C 编写的编译器
【发布时间】:2020-09-22 12:20:26
【问题描述】:

我有一个生成 nasm 程序集的 C 程序。如何将其与 nasm 组装,然后将其与 ld 链接以生成最终的可执行文件?

最简单的方法是将编译器的输出通过管道传输到 nasm,但我希望该过程对用户来说简单:只需键入 compiler myfile 并获取可执行文件。即使我会走那条简单的路线,nasm 似乎也不接受来自标准输入的文件。您必须将它们指定为参数。

所以到目前为止我所做的是:将程序集输出到标准输出,在主进程的标准输出和子进程的标准输入之间创建一个管道,这个进程将调用nasm /dev/stdin。我在这里做错了什么?

【问题讨论】:

  • 你能发布汇编和c代码以及你是如何组装/编译的吗?
  • 有一个 nasm 功能请求 (sourceforge.net/p/nasm/feature-requests/31) 将文件名 - 视为标准输入,但我认为它没有被接受。
  • 上面的解决方案是我一直在想的,我不知道它是否有效,但最重要的是,这是做这种事情的正确方法吗?
  • 我认为我提出的问题很糟糕,但我的主要问题不是“它是否有效”,而是“这样做的最佳方法是什么”。我已经搜索了好几个星期,但是很难找到关于这样一个具体问题的任何信息。我可以做的一件事是查看 GCC 的代码,但也许这里有人已经知道它是如何工作的。
  • 将输出写入临时文件。将其作为输入提供给 nasm。删除临时文件。

标签: c linux compiler-construction pipe nasm


【解决方案1】:

这不是一个答案,而是一个关于如何实现这样一个帮助脚本的建议:

#!/bin/sh
SrcDir="$(mktemp -d)" || exit 1
trap "rm -rf '$SrcDir'" EXIT

cat > "$SrcDir/source.asm"
nasm "$@" "$SrcDir/source.asm"

mktemp -d 创建一个新的临时目录。当 shell 退出时,trap 会删除该目录及其所有内容。请注意,由于该命令是用双引号引起来的,因此在设置陷阱时会评估目录的路径。如果以后换SrcDir,完全不会影响陷阱;原来的临时目录被使用和删除。

脚本的任何参数都将按原样传递给 nasm(由于 "$@"),临时文件的路径作为最终参数。

这种模式在各种情况下都很有用,因为即使脚本被中止(由于说 Ctrl+C 或因为脚本中的错误)。

【讨论】:

    【解决方案2】:

    事实上,您建议的过程将不起作用,因为nasm 读取其输入文件两次(除非您使用 -a 标志禁止预处理器传递)。

    所以/dev/stdin 必须是一个普通文件,而不是管道。如果它是一个普通的文件,它还不如有一个名字。

    所以只需将您的输出写入一个临时文件,对该文件调用 nasm,然后将其删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多