グローバル変数の書き方について
低レイヤを知りたい人のためのCコンパイラ作成入門を参考にコンパイラ作成を行っているのですが、グローバル変数を実装した段階でエラーになりアセンブリをコンパイルできなくなりました。
発生している問題・エラーメッセージ
/usr/bin/ld: /tmp/ccwJk3sF.o: relocation R_X86_64_32S against `.data' can not be used when making a PIE object。 -fPIC を付けて再コンパイルしてください。 /usr/bin/ld: 最終リンクに失敗しました: 出力に対応するセクションがありません collect2: error: ld returned 1 exit status
-fPICをつけて再コンパイルしてもエラーになったため.section data/.section textへ変更したところエラーは回避できたのですが、実行した際にSegmentation faultになってしまいます。
該当のソースコード
gas
1.intel_syntax noprefix 2.data 3x: 4 .zero 8 5.text 6.global main 7main: 8 push rbp 9 mov rbp, rsp 10 sub rsp, 0 11 push offset x 12 push 0 13 pop rdi 14 pop rax 15 mov [rax], rdi 16 push rdi 17 push offset x 18 pop rax 19 mov rax, [rax] 20 push rax 21 pop rax 22 mov rsp, rbp 23 pop rbp 24 ret
###実行コマンド
上記ソースをtmp.sとします。
cmd
1gcc -o tmp tmp.s
補足情報(FW/ツールのバージョンなど)
gcc version 7.4.0
ubuntu 18.04.1
手元のmingwでは再現しませんでした。
アセンブルできるソース全文と、実行したアセンブル・リンク時のコマンドをお願いします。
アセンブリのソース全体とコンパイルコマンドを追加しました。
よろしくお願いいたします。
外しているかもしれませんが、"-no-pie"オプションでどうでしょうか。https://teratail.com/questions/86309
Stackoverflowなどでも同様なものが見受けられます。
https://stackoverflow.com/questions/49434489/relocation-r-x86-64-32-against-data-can-not-be-used-when-making-a-shared-obje
回答1件
あなたの回答
tips
プレビュー