[解決済み] 負荷警告: エントリ シンボル _start が見つかりません
質問
アセンブリプログラミングを勉強しています。以下は、「Hello, World!」を表示する簡単なプログラムです。このプログラムは完璧に実行されるのですが、次のような警告メッセージが表示されます。
loading
ld: 警告: エントリシンボル _start が見つかりません; デフォルトは 0000000008048080 です。
以下はそのコードです。
section .data
msg db 'Hello, world!', 0xa
len equ $ - msg
section .text
global main
main:
mov ebx, 1
mov ecx, msg
mov edx, len
mov eax, 4
int 0x80
mov eax, 1
int 0x80
この警告の意味を説明してくれる人はいますか?私は
nasm
と
ubuntu 14
.
解決方法は?
ラベルを使用する
_start
の代わりに
main
をELFのエントリーポイントとして使用します。
main
は、それがCのようなものであることを意味します。
main
という関数がありますが、これは関数ですらありません(例えば
はできません。
ret
).
エラーメッセージとコードから推測すると、32bitのコードを
nasm -felf32 hello32.asm && ld -melf_i386 -o hello32 hello32.o
(実際に64bitのコードを作っているのであれば、たまたま動いたのはラッキーですが
esp
ではなく
rsp
.)
エラーメッセージは
ld
からではなく
nasm
. メッセージの中にそう書いてあるのです。 Timのコメントが正しいです。
ld
を探します。
_start
シンボルが見つからない場合は、エントリポイントをテキストセグメントの先頭に設定します。
その他、グローバル/外部シンボルを定義しても問題ありません。
main
はここでは全く関係がなく、好きな場所を指すことができます。 逆アセンブルの出力とかで役に立つだけです。 あなたのコードは、もしあなたが
global main
/
main:
の行を削除したり、他の名前に変更したりすることができます。
というラベルを貼る。
main
というのは、ELF のエントリーポイントは
関数ではない
. それは
ではなく
main()
を受信せず、かつ
argc
と
argv
の引数であり
ret
を指しているため、ESPは
argc
は、リターンアドレスではなく
のみを使用します。
main
を探す gcc / glibc の CRT スタートアップ・コードとリンクしている場合。
main
シンボルを呼び出し、libcを初期化した後にそれを呼び出す(だからprintfのような関数が動く。 技術的には、ダイナミックリンカーフックによって、 libc は
_start
をリンクした場合、一般的には何をやっているのか正確に理解していない限り、そのようなことはしないでください)。 関連する
64ビットシステムで32ビットバイナリをアセンブルする (GNUツールチェイン)
例
gcc -m32 -no-pie -o hello main.o
を定義した場合
main:
の代わりに
gcc -m32 -static -nostdlib -o hello start.o
(これは、あなたの素の
ld
).
(ここ数年、Linuxディストロは
でGCCを設定しました。
-pie
をデフォルトとして
これは、位置に依存しないコードを望んでいるのです。 しかし、これはRIP相対アドレッシングのない32ビットモードでは本当に不便で、(たとえば、GCCのasm出力を見てください)
ld
は変換されません。
call printf
を
call printf@plt
をご利用ください。 ですから、ほとんどのチュートリアルに従った手書きの asm では、従来の非 PIE 実行形式が必要で、テキストの再配置は必要ありません)。
関連
-
[解決済み】CentOSのエラー - sudo: effective uid is not 0, is sudo installed setuid root?
-
[解決済み】stdinがターミナルでないため、疑似ターミナルが割り当てられない
-
[解決済み] 予期しないトークン 'then' 付近の構文エラー
-
[解決済み】makeでビルドした後の.dファイルとは?
-
[解決済み】Apacheサーバーがクラッシュし続ける。"caught SIGTERM, shutting down"
-
[解決済み] "grep -q" のポイントは?
-
[解決済み] rm -rfを元に戻すには?[クローズド]
-
[解決済み] STRACEがEAGAINを表示する理由(リソースが一時的に使用できないため)
-
[解決済み] GDB からソースがないとのクレーム
-
[解決済み] LinuxでXcodeを動かせるか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】CentOSのエラー - sudo: effective uid is not 0, is sudo installed setuid root?
-
[解決済み】Linuxのdocker-composeでパーミッションが拒否されました【終了】。
-
[解決済み] "grep -q" のポイントは?
-
[解決済み] glibc: elfファイルのOS ABIが無効です。
-
[解決済み] bash: cd: そのようなファイルやディレクトリはありません
-
[解決済み] フォルダが存在するにもかかわらず、マウントポイントが存在しない。手動でマウントできる
-
[解決済み] Linuxで.dllを使用することは可能です [重複].
-
[解決済み] PowerShellで文字数、単語数、行数を数える
-
[解決済み] bashの「#$」はどういう意味ですか?
-
[解決済み] CMakeエラーです。このプロジェクトでは次の変数が使用されていますが、NOTFOUND に設定されています。