🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

2339閲覧

macOSでのアセンブリ言語のリンクエラー

Sean93jpK4_nll

総合スコア6

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2019/11/02 15:21

編集2019/11/02 17:13

macOSでのアセンブリ言語のリンクエラー

翔泳社の『低レベルプログラミング』の中にあるソースコードがmacのターミナルでリンクしようとするとエラーが出てしまいました。この本のGithubのページを見ながら書き方や環境設定を試してみましたが、どうにも解決しなかったので知恵を貸して頂きたいです。

『低レベルプログラミング』のGithub: https://github.com/Apress/low-level-programming

発生している問題・エラーメッセージ

% nasm -fmacho64 hello.asm && ld hello.o && ./a.out Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64

該当のソースコード

x64

1 global start 2 3 section .text 4start: mov rax, 0x02000004 5 mov rdi, 1 6 mov rsi, message 7 mov rdx, 13 8 syscall 9 mov rax, 0x02000001 10 xor rdi, rdi 11 syscall 12 13 section .data 14message: db "Hello, World", 10

試したこと

もともと_startになっていたものをstartに直したり, mainや_mainにして見ました。

補足情報(FW/ツールのバージョンなど)

mid-2012 13inch macbook air
intel core i5
macOS Catalina version 10.15.1
NASM version 2.14.02 compiled on Sep 28 2019

追記

######otnさん

2019/11/03 00:50

_mainにして見ました。

startは2か所ありますが、両方 _main にしましたか?

両方_mainにしたら

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64

という別のエラーメッセージになりました。リンクと実行は

% nasm -fmacho64 hello.asm && ld hello.o && ./a.out

のままです。ご指摘ありがとうございます。

######asmさん
2019/11/03 01:20

githubには

Linking: ld -macosx_version_min 10.7.0 -lSystem -o hello_world

と書かれていましたがこのオプションは試しましたか?

そのオプションでリンクしようとしたら

ld: warning: -arch not specified ld: warning: ignoring file /usr/lib/libSystem.dylib, missing required architecture unknown in file /usr/lib/libSystem.dylib (2 slices) Undefined symbols for architecture unknown: "start", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture unknown

というメッセージに変わりました。ちなみに中身のstartだった2箇所はotnさんの指摘を受けて両方とも_mainに変えました。ご指摘ありがとうございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/11/02 15:50

> _mainにして見ました。 startは2か所ありますが、両方 _main にしましたか?
asm

2019/11/02 16:20

githubには > Linking: ld -macosx_version_min 10.7.0 -lSystem -o hello_world と書かれていましたがこのオプションは試しましたか?
guest

回答2

0

ベストアンサー

githubの記事のコマンドラインオプションの指定に関する記述が、執筆当時(今から2年前)と古く、また、対象としているmacOSのバージョンも古かったのだと思います。macOS Mojaveで試してみましたが、コメントで指摘いただいていた2箇所の"start"の"_main"への置換と、ldコマンドの"-macosx_version_min" オプションの除去でアセンブルとリンクができました。質問者さんのmacOSはCatalinaですが、参考まで。

bash

1bash-3.2$ cat hello2.asm 2 global _main 3 4 section .text 5_main: mov rax, 0x02000004 6 mov rdi, 1 7 mov rsi, message 8 mov rdx, 13 9 syscall 10 mov rax, 0x02000001 11 xor rdi, rdi 12 syscall 13 14 section .data 15message: db "Hello, World", 10 16 17bash-3.2$ nasm -fmacho64 hello2.asm 18bash-3.2$ ld hello2.o -lSystem -o hello2 19bash-3.2$ ./hello2 20Hello, World 21bash-3.2$

投稿2019/11/02 19:04

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sean93jpK4_nll

2019/11/03 02:03

ありがとうございます!さっき起きてそのコマンドで実行したら無事にHello, Worldが出てこれました。ちなみにbashではなくzshというシェルでしたが問題ありませんでした。改めて感謝申し上げます。
dodox86

2019/11/03 02:41

解決できて良かったです。ちなみにmacOS端末上で「man ld」と打つとldコマンドの詳細が得られます。その内容を照らし合わせるに「何かオプションが違うのかな?」と色々試してみた結果でした。未知のコマンドを使うときはそんな方法で調べてみるのも有りだと思います。
guest

0

Undefined symbols for architecture x86_64:の原因(複数) の中に心当たりはありますか?

投稿2019/11/02 15:48

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sean93jpK4_nll

2019/11/02 17:20

回答ありがとうございます。他のエラーメッセージで、どうやら`/usr/lib/libSystem.dylib`というライブラリの中にないものがあるそうです。これ以上は私の勉強不足のせいか分かりませんでした。申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問