3

ファイルは2つしかないので、NASMmain.ckernel.asmGCCを使ってプログラムを作ってみました。内容は以下の通りです。

main.c

#include <stdio.h>

void Print_String() {
    printf("Hello World!\n");
}

kernle.asm

extern Print_String

[section .text]
global _start
_start:
    call Print_String

コンパイルとリンク:

nasm -f elf -o kernel.o kernel.asm
gcc -c -o main.o main.c
ld -s -lc -o final kernel.o main.o

次にfinal、次のコマンドを使用してファイルを実行します./finalが、結果は気のめいるようです。

bash: ./final: No such file or directory

ただし、現在のディレクトリにはファイルがありますfinal。コマンドlsの場合、次のように表示されます。

final  kernel.asm  kernel.o  main.c  main.o

では、なぜファイルが見つからないのfinalでしょうか。何か問題でもありますか?助けていただければ幸いです。

4

3 に答える 3

4

それ自体が見つからないということではありません。エラーメッセージはやや誤解を招く可能性があります。ダイナミックリンカはその依存関係を解決できないため、プログラムイメージをロードできません(実行できません)。

問題は、動的リンクを実際に機能させるために、他の道具を使用せずにlibcに対して動的にリンクしていることです。したがって、ロードできないバイナリイメージが残ります。

libcに対して静的にリンクする方が簡単な場合があります。これは次のように実行できます。

ld -Bstatic -o final kernel.o main.o -lc

'-lc'ビットをそれを使用するコードモジュールmain.oの後に移動する必要があることに注意してください。

これを試してみると、未解決のシンボルがたくさん表示されます。これは、libgccおよびlibgcc_ehに対してもリンクする必要があるためです。

以下は私をかなり近づけました(申し訳ありませんが、ここでは64ビットシステムで作業しています):

ld -L/usr/lib/gcc/x86_64-linux-gnu/4.4.3/32/ -melf_i386 -Bstatic -lc -o final kernel.o main.o -lc -lgcc -lgcc_eh

これは私にとって失敗しました

/usr/lib/gcc/x86_64-linux-gnu/4.4.3/32//libgcc_eh.a(unwind-dw2-fde-glibc.o): In function `_Unwind_Find_FDE':
(.text+0x193b): undefined reference to `dl_iterate_phdr'

これはあまり意味がありません。32ビットシステムで32ビットをリンクする方が幸運かもしれません。

アップデート

上記のランブルについてお詫び申し上げます。これについて改めて考えましたが、もちろんダイナミックリンクを機能させることは可能です。不足している部分は、ダイナミックリンカーを指定することです。

私の場合、これは次のとおりです。

ld -dynamic-linker /lib32/ld-linux.so.2 -melf_i386 -o final kernel.o main.o -lc

したがって、次のことが機能するはずです。

ld -dynamic-linker /lib/ld-linux.so.2 -o final kernel.o main.o -lc

再度更新する

markzarのコメントに応えて、クリーンに終了するにはシステムコールを作成する必要があります。これには、Cのexit(0)と同様のことを行う効果があります。

mov eax,1  ; Syscall #1       
mov ebx,0  ; Return code 0 = success
int 80H
于 2013-02-14T04:47:43.403 に答える
1

これを試して。まず、kernel.asmを次のように変更します。

extern Print_String

[section .text]
global main
main:
    call Print_String

次に、次のコマンドを使用して、(リンカーの代わりに)実行可能ファイルを作成します。

nasm -f elf -o kernel.o kernel.asm
gcc -c -o main.o main.c
gcc -o final kernel.o main.o
于 2013-02-14T05:26:55.587 に答える
0

非常に単純です。main()プログラムを呼び出す必要はありません...したがって、何をしても、Cプログラムの起動機構は機能しません。

于 2013-02-19T17:00:17.813 に答える