半年ぶりぐらいにコンパイラ作成の続きをしているのですが、文字列リテラルを追加しようとしました。
コードの出力はできたのですが、実行してみると以下のエラーが表示されました。
```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 件のコメント :
コメントを投稿