NASM
代码?”(例如,通过*.c
将*.out
转换为NASM
二进制文件)。根据我的独立研究(我将在下面介绍),我得出的答案是“否”,但我希望获得更多专家的意见。
正如我在这个问题中引用了一些 StackOverflow 帖子,许多好的链接显示了如何获取和编译,但它们要么有点旧,要么适用于 32 位(如何在 Linux 上从 c 源代码生成 nasm 可编译的汇编代码?),并且因为我的问题专门针对 64 位
NASM
,所以我认为不可能重复。
目前,我正在从事一个涉及程序集重写的项目。我有一个适用于
GAS
装配文件的原型。
但是,我听同事说使用
NASM
汇编文件(我之前不知道)更好。经过搜索,我确信,如果我要考虑项目的多种情况,NASM
似乎确实是更好的汇编格式(第二篇文章给了我一个很好的理由为什么我应该尝试追求NASM
):
为了给出更精确的示例,我重新组装
GAS
文件所需的步骤是无需进行任何无关修改的,如下步骤所示:
gcc -save-temps -masm=intel main.c foo.c bar.c (this will generate a-*.s automatically)
python3 reassemble_asm.py --files=a-foo.s,a-main.s,a-bar.s
as *.s -o *.o
gcc *.o -o main.out
相比之下,对于
NASM
来说,要首先获得NASM
,需要经过多个过程,如下所示:将C转换为nasm汇编,然后,对于64位编译来说,它变得更加棘手,因为它似乎需要大量修改:在64位模式下编译NASM代码时出现重定位错误。
如果我尝试编译此处所示示例的 64 位:Converting C to nasm assembly,
// hello.c
#include <stdio.h>
int main()
{
printf( "Hello World \n" );
return 0;
}
gcc -fno-asynchronous-unwind-tables -fno-pie -no-pie -s -c -o hello.o hello.c
objconv -fnasm hello.o
nasm -f elf64 hello.asm # this needs to be elf64, not elf
gcc hello.o -o hello
/usr/bin/ld: hello.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status
正如我上面提到的,由于搬迁问题,这将不起作用。我尝试做很多我找到的解决方案(
-fno-pie
,default rel
等),但无济于事(这个演示与我的问题无关,只是想提供这个例子以使问题更完整)。
根据我收集/搜索的内容,我的直觉是
NASM
在生成/修改/编译汇编文件方面并不直观,我需要坚持使用GAS
。然而,由于我缺乏汇编语言知识(因为直到现在我才知道NASM
),我想确保在做出这样的选择之前我已经用尽了所有的选择。
此外,也许还有一种我还没想到的方法可以使用
NASM
;所以我想问这个问题。
预先感谢您。