有没有一种直观的方法从c源代码获取/编译64位NASM代码? [重复]

问题描述 投票:0回答:0

问题是,“是否有一种直观的方法从源文件获取/编译
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
;所以我想问这个问题。 预先感谢您。

assembly nasm gnu-assembler
© www.soinside.com 2019 - 2024. All rights reserved.