実験コードを載せます。
C
1#include<stdio.h> 2 3int main(){ 4 printf("you will make me happy\n"); 5 return 0; 6}
**gcc source.c -o source **とやるとデフォルトで位置独立形式になる環境があるようです。
ubuntu16.10でemacsをビルドしたい
これを非位置独立形式にしたいです。
gcc source.c -fno-PIE -c
gcc source.o -fno-pie -o source
とやっても、
/usr/bin/ld: test_hello.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object。 -fPIC を付けて再コンパイルしてください。 /usr/bin/ld: 最終リンクに失敗しました: 出力に対応するセクションがありません collect2: error: ld returned 1 exit status
と出現します。
他に方法はありませんか??
教えてください。
Linux 64bit debian系 gcc です。
非位置独立形式にしたいのは、なぜ?位置独立にするために工夫してきた歴史があるのに、わざわざ逆向きの努力などしませんけどねえ。
いえいえ、通常は、Linuxインストール時のgccは非位置独立形式なはずです。スタートアドレスが0x400000で始まるヤツですね。gccを再コンパイルする以外で非位置独立形式にする方法を探しています。理由は以前アセンブリの考察でリンクできなかったヤツですね。
通常、位置独立形式にしたい場合は、-fPIE -fpie などを付けてコンパイルするはずです。しかし稀に特殊なディストリビューションではデフォルトで位置独立形式が有効になっているようです。
「特殊なディストリビューション」以外のディストリビューションを使う、じゃダメなの?その「特殊なディストリビューション」で非位置独立なプログラムをコンパイルしたところで、そのプログラムは目的のアドレス以外では動作できなくなるwんじゃないの?
「目的のアドレス以外では動作できなくなる」どういうことですか? リンクの段階でエラーが出ているので・・・実行する時の動作は関係ないのではないでしょうか? 「カーネルが非位置独立形式ではないと実行できないようになっている」ということでしょうか?? ディストリビューションが違ってもカーネルは同じなのでは?
カーネルをビルドしたい?どこにそんな事を書いた?それは、今の君には手にあまる仕事じゃないのか? 「出力に対応するセクションがありません」.rodataセクションを設定できればよい、とかそういうことじゃないの?攻める場所が違うんじゃないかな。 事情と目的をはっきりさせないと答えは出てこないのでは? ちなみに、位置独立コードとしてコンパイルしたカーネルを使う事例(Linuxではないが)はある。ロードアドレスは、ビルドでない段階で決めて良いのだ。
カーネルをビルドしたいのではなくて、位置独立形式で動作させる事とカーネルが同じであるディストリビューションは関係がないのではないでしょうか?ということです。 shared objectと出ている時点で変なのでオプションが足りないか、間違っているかでしょうかね・・・?(調べていますが、なかなか出てこない・・・)
さあ?むしろエラーメッセージには「-fPICをつけて再コンパイルしてください」とあるが、やってみたの? 俺には君の言ってることがよくわからない=説明になっていない、という感じ。君は思い込みにとらわれて、あらぬ方向に突っ走ってるって印象。
-fPICをつけてもダメですね。エラーは消え、リンクはできますが位置独立形式のままです。意味がありません。
回答2件
あなたの回答
tips
プレビュー