如何从汇编中调用C编写的代码?

Bul*_* M. 5 c x86-64 yasm

已解决的问题 应使主符号全局化,以便链接器在链接时可以在目标文件中找到它.更正了代码.

在执行任务时,尝试从程序集中调用简单的C函数(YASM汇编程序):

写了C函数:

#include <stdio.h>

void
func_in_c(char *s)
{
        printf("%s", s);
}
Run Code Online (Sandbox Code Playgroud)

写了调用汇编代码:

        segment .data
str_t_c db "Wow", 0

        segment .text
        global  main ; That is the solution - let linker find global symbol
        extern printf
        extern func_in_c
main:
        push rbp
        mov rbp, rsp
        lea rdi, [str_to_c]
        call func_in_c
        leave
        ret
Run Code Online (Sandbox Code Playgroud)

汇编汇编:

yasm -f elf64 -m amd64 -g dwarf2 main.asm
Run Code Online (Sandbox Code Playgroud)

编译c代码:

gcc -o main_c.o -c main_c.c
Run Code Online (Sandbox Code Playgroud)

试图将两个目标文件链接到单个可执行二进制文件:

gcc -o main main_c.o main.o
Run Code Online (Sandbox Code Playgroud)

拿到:

...
In function _start:
(.text+0x20): undefined reference to main
...
Run Code Online (Sandbox Code Playgroud)

您对如何更正命令/代码以构建可执行文件有什么建议吗?是的,我读过类似的问题(使用NASM汇编程序,但没有解决方案可行).

cad*_*luk 3

您需要main首先将标签设为全局标签,否则目标文件将不包含该符号,并且链接器将无法识别它。