使用system()从C程序调用NASM会生成不同的对象代码,然后使用Bash调用

时间:2012-10-06 16:49:46

标签: c++ assembly linker g++ nasm

我已经实现了一个相当不错的优化编译器(用于玩具语言),并且遇到了一个相当令人费解的场景。我可以从中获取输入文件并生成汇编,因此在这方面“编译器”已完成。如果我把那个汇编文件用NASM汇总并用G ++将它链接到我的运行时支持库(运行时需要libstdc ++),我得到一个可用的可执行文件,没有错误。但是,我希望能够在一个命令中编译成可执行文件,所以我向system添加了一些对我的编译器的调用,并传递了我在bash中使用的EXACT SAME COMMANDS。当我运行编译器时,它似乎正确组装,但链接步骤(再次,使用g ++)失败了undefined reference to main。困惑,我试图手动链接(没有重新组装,所以我使用由system运行的NASM生成的目标文件,并收到相同的错误。如果我使用新编译器的汇编输出重新组装,我没有问题这让我们相信NASM就是问题所在。就像我说的那样,命令是完全一样的(我只是复制并粘贴它们只是为了确保在第一次之后)。这是环境变量还是什么?发生了什么? ?

编辑: 我手动组装了一个目标文件,再次使用与编译器中的命令相同的命令,我在两者之间做了一个vim diff。编译器生成的似乎只包含ELF头。

编辑2: 差异screenshot

的屏幕截图

编辑3: 我尝试使用system来调用Perl脚本,而后者又会调用NASM和G ++,但仍然没有运气。

1 个答案:

答案 0 :(得分:1)

修正了它!由于竞争条件,文件没有被刷新。感谢所有的帮助,非常感谢。