質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

解決済

2回答

8025閲覧

gccで非位置独立化する方法

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

0クリップ

投稿2017/07/30 08:00

実験コードを載せます。

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 fno-pie

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 です。

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

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

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

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

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

rubato6809

2017/07/31 02:35

非位置独立形式にしたいのは、なぜ?位置独立にするために工夫してきた歴史があるのに、わざわざ逆向きの努力などしませんけどねえ。
strike1217

2017/07/31 02:39

いえいえ、通常は、Linuxインストール時のgccは非位置独立形式なはずです。スタートアドレスが0x400000で始まるヤツですね。gccを再コンパイルする以外で非位置独立形式にする方法を探しています。理由は以前アセンブリの考察でリンクできなかったヤツですね。
strike1217

2017/07/31 02:42 編集

通常、位置独立形式にしたい場合は、-fPIE -fpie などを付けてコンパイルするはずです。しかし稀に特殊なディストリビューションではデフォルトで位置独立形式が有効になっているようです。
rubato6809

2017/07/31 02:46

「特殊なディストリビューション」以外のディストリビューションを使う、じゃダメなの?その「特殊なディストリビューション」で非位置独立なプログラムをコンパイルしたところで、そのプログラムは目的のアドレス以外では動作できなくなるwんじゃないの?
strike1217

2017/07/31 02:52

「目的のアドレス以外では動作できなくなる」どういうことですか? リンクの段階でエラーが出ているので・・・実行する時の動作は関係ないのではないでしょうか? 「カーネルが非位置独立形式ではないと実行できないようになっている」ということでしょうか?? ディストリビューションが違ってもカーネルは同じなのでは?
rubato6809

2017/07/31 03:10

カーネルをビルドしたい?どこにそんな事を書いた?それは、今の君には手にあまる仕事じゃないのか? 「出力に対応するセクションがありません」.rodataセクションを設定できればよい、とかそういうことじゃないの?攻める場所が違うんじゃないかな。 事情と目的をはっきりさせないと答えは出てこないのでは? ちなみに、位置独立コードとしてコンパイルしたカーネルを使う事例(Linuxではないが)はある。ロードアドレスは、ビルドでない段階で決めて良いのだ。
strike1217

2017/07/31 03:28 編集

カーネルをビルドしたいのではなくて、位置独立形式で動作させる事とカーネルが同じであるディストリビューションは関係がないのではないでしょうか?ということです。 shared objectと出ている時点で変なのでオプションが足りないか、間違っているかでしょうかね・・・?(調べていますが、なかなか出てこない・・・)
rubato6809

2017/07/31 03:51

さあ?むしろエラーメッセージには「-fPICをつけて再コンパイルしてください」とあるが、やってみたの? 俺には君の言ってることがよくわからない=説明になっていない、という感じ。君は思い込みにとらわれて、あらぬ方向に突っ走ってるって印象。
strike1217

2017/07/31 03:55

-fPICをつけてもダメですね。エラーは消え、リンクはできますが位置独立形式のままです。意味がありません。
guest

回答2

0

ベストアンサー

-no-pieで、いいんじゃないでしょうか。

投稿2017/08/01 07:18

Harahira

総合スコア243

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

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

strike1217

2017/08/01 07:24

おおお!! できました!すばらしい!! gcc -no-pie source.c -o source でできました! ありがとうございます。
guest

0

-static でよかったのでは?

bash

1rubato@deb-rubato:~$ uname -a 2Linux deb-rubato 4.9.0-3-amd64 #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26) x86_64 GNU/Linux 3rubato@deb-rubato:~$ cat printme.c 4#include <stdio.h> 5int glob; 6int main(void) 7{ 8 auto int sp; 9 printf(" main: %p\n", main); 10 printf("global: %p\n", &glob); 11 printf(" stack: %p\n", &sp); 12 return 0; 13} 14rubato@deb-rubato:~$ cc printme.c 15rubato@deb-rubato:~$ ./a.out 16 main: 0x560e592056b0 17global: 0x560e59406034 18 stack: 0x7ffd7983219c 19 20rubato@deb-rubato:~$ cc -static printme.c 21rubato@deb-rubato:~$ ./a.out 22 main: 0x400aae 23global: 0x6b4d58 24 stack: 0x7ffc0843552c 25rubato@deb-rubato:~$ ./a.out 26 main: 0x400aae 27global: 0x6b4d58 28 stack: 0x7fffe1c0a04c

投稿2017/08/01 00:04

rubato6809

総合スコア1380

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

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

strike1217

2017/08/01 04:46

あ〜〜。 すいません。ダイナミックリンクでの話をしています。 書くの忘れていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問