解決済みの質問 リンカがリンク時にオブジェクトファイルでそれを見つけることができるように、メインシンボルをグローバルにする必要があります。コードを修正しました。
タスクを実行するときに、アセンブリ (YASM アセンブラー) から単純な C 関数を呼び出そうとしました:
C 関数を書きました:
#include <stdio.h>
void
func_in_c(char *s)
{
printf("%s", s);
}
呼び出しアセンブリ コードを書きました:
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
コンパイルされたアセンブリ:
yasm -f elf64 -m amd64 -g dwarf2 main.asm
コンパイルされた c コード:
gcc -o main_c.o -c main_c.c
両方のオブジェクト ファイルを単一の実行可能なバイナリ ファイルにリンクしようとしました:
gcc -o main main_c.o main.o
得た:
...
In function _start:
(.text+0x20): undefined reference to main
...
コマンド/コードを修正して実行可能ファイルをビルドする方法について何か提案はありますか? はい、同様の質問を読みました(ただし、NASMアセンブラを使用しても解決策はありません)。