在linux中从C代码调用汇编函数

标签 c linux assembly

我想从我的 C 程序调用打印函数。
汇编程序:

 #test.s
.text

    .global _start
    .global print
    .type print, @function

_start:

        call print

        # and exit.

        movl    $0,%ebx         # first argument: exit code.
        movl    $1,%eax         # system call number (sys_exit).
        int     $0x80           # call kernel.

print:
    # write our string to stdout.

        movl    $len,%edx       # third argument: message length.
        movl    $msg,%ecx       # second argument: pointer to message to write.
        movl    $1,%ebx         # first argument: file handle (stdout).
        movl    $4,%eax         # system call number (sys_write).
        int     $0x80           # call kernel.

        mov $0,   %eax
        ret
.data

msg:
        .ascii  "Hello, world!\n"      # the string to print.
        len = . - msg                  # length of the string.

我可以使用以下方法组装和链接它:

$as test.s -o test.o
$ld test.o -o test

我可以将它作为程序执行,它输出“Hello, world!” 但是当我尝试从 C 代码调用 print 时,如下所示:

#include <stdio.h>
extern int print();

int main(){
    int g;
    g = print();
    printf("Hello from c!, %d\n", g);

}

它是使用以下方式编译的:

$gcc -c main.c test

它只是打印“Hello from c, 13”,这意味着该函数被调用并返回一些字符,但不打印任何内容!

我做错了什么?

附注 当我尝试像这样编译 prog 时:

$as test.s -o test.o
$gcc -c main.c -o main.o
$gcc main.c test.o 

我有一个错误:

/usr/bin/ld: test.o: in function `_start':
(.text+0x0): multiple definition of `_start'; /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o:(.text+0x0): first defined here
/usr/bin/ld: test.o: relocation R_X86_64_32 against `.data' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status

最佳答案

好的,完成!谢谢clearlight

我可以编译所有使用

$as test.s -o test.o
$gcc -c main.c -o main.o
$gcc -no-pie main.c test.o 

一切都会正常进行!

关于在linux中从C代码调用汇编函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60352424/

相关文章:

linux - 带有 cx 寄存器的 NASM 汇编器无限循环

c - NCurses/PDCurses ( C ) 中的多行文本输入

c - fscanf 读访问段错误

c - 尝试按字节读取图像字节时出现段错误 11

c - Fork Process/Read Write through pipe 慢

assembly - 如何使用 x64dbg 记录程序执行的 CPU 指令?

c - 全局客户表 C : Chatroom

c++ - Linux 上未采用分支

python - 在linux上与windows上不同的sqlite中存储空的python元组

string - MIPS 汇编 - 从输入字符串中删除元音