用C程序编译ASM文件的命令

用C程序编译ASM文件的命令,c,linux,assembly,x86-64,C,Linux,Assembly,X86 64,使用64 Linux系统并使用NASM 我也尝试将我的ASM(hello.ASM)文件与C文件(main.C)链接,并编译为执行文件 我使用printHello函数创建了一个ASM文件,该文件使用printf打印“Hello” extern printf, exit section .data format db "Hello", 10, 0 section .text global printHello printHello: sub rsp, 8

使用64 Linux系统并使用NASM

我也尝试将我的ASM(hello.ASM)文件与C文件(main.C)链接,并编译为执行文件

我使用printHello函数创建了一个ASM文件,该文件使用printf打印“Hello”

extern printf, exit
section .data
    format db "Hello", 10, 0
section .text
    global printHello
    printHello:
        sub rsp, 8
        mov rsi, 0x12345677
        mov rdi, format
        xor rax, rax
        call printf
        mov rdi, 0
        call exit
我创建一个简单的main.c并调用函数“printHello”来打印“Hello”

它会打印:

./executable: Symbol `printf' causes overflow in R_X86_64_PC32 relocation
./executable: Symbol `exit' causes overflow in R_X86_64_PC32 relocation
[1]    6011 segmentation fault  ./executable

我已经在学习ASM了。问题是来自我的命令还是代码?

我使用您的@Jester解决方案解决了问题:

gcc-no pie-o可执行main.o hello.o


感谢Ped7g的解释。

什么版本的linux什么版本的gcc,
文件可执行文件的输出是什么?PS:在此期间,您可能可以将
printf
更改为
printf wrt..plt
以及类似的
exit
。输出是可执行的:ELF 64位LSB共享对象,x86-64,版本1(SYSV),动态链接,解释器/lib64/ld-linux-x86-64。对于GNU/linux 2.6.32,BuildID[sha1]=f1ef9d13c6162ebb2c4085402decc5735083b483,未剥离我使用:gcc(Debian 6.4.0-2)6.4.0 20170724和发行版是:Linux benjamin PC 4.14.0-deepin2-amd64#1 SMP抢占Deeptin 4.14.12-2(2018-01-06)x86_64 GNU/Linux问题来自默认设置的Linux生成PIE/PIC 64b代码,这需要以更复杂的方式编写与C交互的程序集。如果您只是在学习汇编,可能会重新考虑关闭PIE/PIC,并生成与位置相关的二进制文件,起初甚至可能是静态链接的,以避免PIC和与.so libs动态链接的复杂性。或者只是更努力地学习这个主题,如何以预期的方式编写这些,这增加了一点复杂性,但它是实际使用的当前实用工具,所以它不像学习DOS中断…是的,这意味着你在一个默认使用PIE的系统上。您也可以尝试
gcc-no pie
。也就是说,在我的系统上,我得到了一个链接器错误,它不会生成可执行文件。你也可以在codereview上检查我的答案,我在那里努力获得正确的饼图二进制文件,从asm调用Clib函数,我在那里保留了不同的阶段(包括不完全正确的阶段)以及注释我必须做的更改:
$ nasm -f elf64 hello.asm
$ gcc -c main.c
$ gcc -o executable main.o hello.o
$ ./executable
./executable: Symbol `printf' causes overflow in R_X86_64_PC32 relocation
./executable: Symbol `exit' causes overflow in R_X86_64_PC32 relocation
[1]    6011 segmentation fault  ./executable