5

解決済みの質問 リンカがリンク時にオブジェクトファイルでそれを見つけることができるように、メインシンボルをグローバルにする必要があります。コードを修正しました。

タスクを実行するときに、アセンブリ (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アセンブラを使用しても解決策はありません)。

4

1 に答える 1

3

最初にラベルをグローバルにする必要がありmainます。そうしないと、オブジェクト ファイルにシンボルが含まれず、リンカーがそれを認識しません。

于 2016-09-11T11:09:29.390 に答える