[コンパイラ作成] 文字列リテラルを追加しようとしたら "can not be used when making a PIE object; recompile with -fPIC" とか言い出した

半年ぶりぐらいにコンパイラ作成の続きをしているのですが、文字列リテラルを追加しようとしました。 コードの出力はできたのですが、実行してみると以下のエラーが表示されました。 ```text `gutter:false; /usr/bin/ld: /tmp/ccyB40LQ.o: relocation R_X86_64_32S against `.data' can not be used when making a PIE object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status ``` 実行する時のスクリプトは以下の感じです。 ```bash `gutter:true; ./9cc "${test_code}" > tmp.s gcc -o tmp tmp.s test.o ./tmp actual="$?" ``` gccの後に-fPICオプションを入れてもダメでいろいろ調べた所、[ここ](https://www.sigbus.info/compilerbook#dynamic-linking)に解決方法が書かれていました。さすがです。 (もう少し下まで読めば分かったのか....) ## 解決方法 実行ファイルを生成する時にstaticオプションをいれる。 ```bash `gutter:true; ./9cc "${test_code}" > tmp.s gcc -static -o tmp tmp.s test.o ./tmp actual="$?" ``` 1日ちょっとはまりました。 ## 参考URL - [ダイナミックリンク](https://www.sigbus.info/compilerbook#dynamic-linking) - [プロジェクトの場所](https://github.com/k28/9cc)

0 件のコメント :

コメントを投稿