トップページ⇒tech
1001コメント281KB

GCCについて part8

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/10/13(土) 00:07:39
史上最強かもしれないツール、GCC(GNU Compiler Collection)について語るスレ。

GNU本家のGCCページ
http://gcc.gnu.org/

Binutils - Collection of binary utilities ←これも必要だぞ。
http://www.gnu.org/directory/GNU/binutils.html

GNU Binutils
http://sources.redhat.com/binutils/

GCC online documentation
http://gcc.gnu.org/onlinedocs/

Installing GCC
http://gcc.gnu.org/install/

GCC Timeline
http://gcc.gnu.org/releases.html#timeline

Calendar
http://gcc.gnu.org/develop.html#timeline

前スレ
GCCについて part7
http://pc11.2ch.net/test/read.cgi/tech/1145357824/l50
0002 ◆3.JjF77I26 2007/10/13(土) 00:58:22
2get
0003デフォルトの名無しさんNGNG?2BP(100)
>>1乙
0004デフォルトの名無しさん2007/10/17(水) 11:28:31
x86です。

double d = 0.3; int i;
i = d * 1000;

とすると i=299になります。

d = d * 1000; i = d;

とするとi=300になります。 Macのgccで試したら300になるので生成したコードを調べると
SSE2インストラクションを使ってました。試しに-msse2でコンパイルすると両方とも300に
なりました。 gccは3.2.2, 3.3.5, 4.1.1と試しましたが全部同じです。

manに書かれている以下の文が関係しているのでしょうか?

... -msse2 ...

The resulting code should be considerably faster in the major-
ity of cases and avoid the numerical instability problems of
387 code,

この問題をどこか詳しく説明している文書はありますでしょうか? 
0005デフォルトの名無しさん2007/10/17(水) 11:56:17
x86は浮動小数点数レジスタが80ビットあり、演算はこの大きさで行われる
メモリに書き戻されるタイミングで64ビットに切り捨てられるのだが、
コンパイラの最適化の具合によって
メモリに書き戻されるタイミングが変わり、計算結果が変わることがある
0006デフォルトの名無しさん2007/10/17(水) 17:19:41
floatだと300になるんだよなぁ。
最初の方で
double d = 2.99999999999999988897769753748434595763683319092e-1;
float f = 3.00000011920928955078125e-1;
に変換されていた。
-O0だとハードウェアが使うそのままの形で渡すから、マシン依存ってことかな?
-O2だとmsse2じゃなくても300になった。
http://gcc.gnu.org/bugs.html#known だね。

gccはrtlとか出てきたらよく分からんなぁ。GIMPLEはわかりやすいんだが。。。
0007デフォルトの名無しさん2007/10/17(水) 19:24:51
GCC用のソースをVCでコンパイルできるようにしてたときにちょっと引っかかったんだけど、
構造体の初期化でメンバ名を指定できるのと、その他の初期値を指定できるなんて
初めて見たよ。
たしかに便利っちゃぁ便利だけど...
0008デフォルトの名無しさん2007/10/17(水) 19:39:32
全然普及しないC99
000942007/10/17(水) 19:41:08
>>5 >>6
大変参考になりました。 ありがとうございます!
0010デフォルトの名無しさん2007/10/18(木) 06:39:02
>>7
VCってC99サポートしてないの?
0011デフォルトの名無しさん2007/10/18(木) 06:52:22
してないよ
0012デフォルトの名無しさん2007/10/18(木) 16:55:33
低反発枕が凄い硬くて反発力が激しいのですが何とかなりませんか。
0013デフォルトの名無しさん2007/10/18(木) 18:13:06
知るか
0014デフォルトの名無しさん2007/10/18(木) 18:51:03
>>7
コンパウンドリテラル
0015デフォルトの名無しさん2007/10/19(金) 16:41:06
>>7
designated Initializerか
>>8にもあるけどC99で取り入れられてるな
0016デフォルトの名無しさん2007/10/20(土) 08:33:01
max-inline-insns-singleはどのようなときに設定するものなのでしょうか?
0017デフォルトの名無しさん2007/10/20(土) 19:19:15
>>6

いや、0.3=3/10は2進数では無限小数になって丸め誤差が出ているだけでは?

0.3 = 0.10011001100110011001100…
0018デフォルトの名無しさん2007/10/20(土) 20:54:41
>>17 0.010011001・・・
0019デフォルトの名無しさん2007/10/25(木) 06:16:18
gccのプリプロセッサが、ヘッダファイルをどのディレクトリから探しているのか、探している様子を
画面表示するオプションは無いでしょうか?

gccの-iprefixオプションを使うと、途端にいくつかの標準ヘッダが見付からなくなる現象で悩んでます。
0020デフォルトの名無しさん2007/10/25(木) 09:08:33
-vじゃだめなの?
0021デフォルトの名無しさん2007/10/27(土) 07:52:36
GCC 4.3.0 Status Report (2007-10-25)
http://gcc.gnu.org/ml/gcc/2007-10/msg00441.html

stage3まではサクサク進んできたけど、現在バグ取りで膠着状態
まだまだ使える状態じゃないっぽい
0022デフォルトの名無しさん2007/10/27(土) 10:29:55
コード生成以後もいろいろ大変なんだろうけど、
C++やJavaみたいに、言語規格自体が大きくて、
しょっちゅう変更される言語も含まれるから、
リリースがどんどん重くなりそうだね。

libstdc++なんか、言語処理系のバージョンとの関係が切り放せないし。
0023デフォルトの名無しさん2007/10/27(土) 22:51:53
C++は変更が2009年までに本当に終わるのかどうかが心配されているわけだが。。。
0024デフォルトの名無しさん2007/10/27(土) 22:55:55
gcc -gと-ggdbと-g3の違いは何でしょうか。gcc-4.1.2です。
0025デフォルトの名無しさん2007/10/28(日) 01:31:47
デバッグ情報をどれだけ入れるかの違い。
0026デフォルトの名無しさん2007/10/28(日) 01:33:24
もう少し具体的に。
-g3のマクロ云々はいいので、-gと-ggdbだけでも。
0027デフォルトの名無しさん2007/10/28(日) 02:03:55
gcc -g はmanで詳細が調べられる
gcc -ggdbはmanで詳細が調べられる
gcc -g3はmanで詳細が調べられる

これぐらいかな違いは。
0028デフォルトの名無しさん2007/10/28(日) 02:08:43
manにもinfoにも載ってないよ。
0029デフォルトの名無しさん2007/10/28(日) 05:58:40
構造体のパックってどうやるんですか
0030デフォルトの名無しさん2007/10/28(日) 07:06:55
パックしたい構造体に#pragma pack(1)を使う
0031デフォルトの名無しさん2007/10/28(日) 07:36:09
__attribute__((packed)) は?
0032デフォルトの名無しさん2007/10/28(日) 16:10:01
>>30-31
pragma より atribute がお勧め。
0033デフォルトの名無しさん2007/10/28(日) 16:21:57
今時、構造体のパックして何するの?
0034デフォルトの名無しさん2007/10/28(日) 17:31:01
お肌にいい
0035デフォルトの名無しさん2007/10/28(日) 17:40:37
>>33
昔は必要だったの?
0036デフォルトの名無しさん2007/10/28(日) 17:56:39
>>33
余計なalignmentが入るのを防ぐ。

最初にデータ構造ありき、な時は必要でしょ。
ファイルフォーマットとかパケットの構造体作る時とか。
0037デフォルトの名無しさん2007/10/28(日) 18:08:32
そういうわけだから、今でも要るところには要る。
0038デフォルトの名無しさん2007/10/28(日) 18:14:06
アライメント違反でSIGBUSするCPUの場合はどうするの?
0039デフォルトの名無しさん2007/10/28(日) 18:17:31
>>38
ずっと前に、コンパイラがバイト単位での読み書きに翻訳してくれたりした覚えが
あるんだけど、今考えるとメンバ単体をポインタ経由でアクセスしたら死にそう。
0040デフォルトの名無しさん2007/10/28(日) 18:27:17
OSのカーネルがやってくれる場合もあるな。
でも、OSもコンパイラも面倒見てくれない環境もあるべ。

自分でバイト単位に書き込むのか?
0041デフォルトの名無しさん2007/10/28(日) 18:33:59
>>40
だれも面倒見てくれないんなら自分でやればいいだろ。
0042デフォルトの名無しさん2007/10/29(月) 12:23:46
>>40
trapで落ちてからか〜、大昔からあるテクニックだけど今時のマシンでやったらstallしまくりでいやげだなぁ。
softfloatとかも便利だけど鈍いよね。

0043デフォルトの名無しさん2007/10/29(月) 21:34:43
>>42
だがそれがいい
0044デフォルトの名無しさん2007/10/29(月) 22:07:24
>>40
エミュするのめんどいんで、自力でなんとかしてくれ。

>>42
正確に数えたことないけど数十倍の時間がかかるはず。
根性でもう少し高速化できるかも知れんが、あくまで救済措置だからのう…
そんな所にエネルギー使いたくない。


0045デフォルトの名無しさん2007/10/31(水) 03:47:24
__DATE__とか__TIME__を現在の日時に展開するのをやめさせたいんですが、何か方法はありますか?
こいつらのせいで、毎回チェックサムの異なるバイナリが生成されてしまいます・・・。
0046デフォルトの名無しさん2007/10/31(水) 04:11:29
undef?
0047デフォルトの名無しさん2007/10/31(水) 04:27:42
できないみたい
0048デフォルトの名無しさん2007/10/31(水) 04:29:32
__DATE__と__FILE__を含む行をコメントアウト
0049デフォルトの名無しさん2007/10/31(水) 04:32:55
#define __DATE__ ""
はムリ?
0050デフォルトの名無しさん2007/10/31(水) 04:36:47
redefeindでerror
0051デフォルトの名無しさん2007/10/31(水) 04:50:28
コンパイルオプションに -undef ってなかったっけ?
それでも __DATE__ とかには効かないかもしれないけどね。
0052デフォルトの名無しさん2007/10/31(水) 06:01:50
#if defined(__DATE__)
#undef __DATE__
#define __DATE__ "2007/10/31"
#endif
0053デフォルトの名無しさん2007/10/31(水) 12:12:54
-undefは他のマクロも消えて影響大きすぎるから
gcc -U__DATE__ -D__DATE__=\"hoge\" でいいだろ。
0054デフォルトの名無しさん2007/10/31(水) 18:09:14
無料だな
0055デフォルトの名無しさん2007/11/02(金) 13:37:57
4.3もやっぱり実行速度は今までのより遅くなっているみたいだね
0056デフォルトの名無しさん2007/11/06(火) 05:57:27
マルチスレッドと最適化の問題。 難しいもんですね。
http://kerneltrap.org/Linux/Fixing_Compiler_Misoptimizations
0057デフォルトの名無しさん2007/11/07(水) 01:33:13
LLVMってどうなのさ
0058デフォルトの名無しさん2007/11/07(水) 16:03:54
llvmで検索してでてくる日本語サイトがゴミ
0059デフォルトの名無しさん2007/11/08(木) 01:21:07
gccのltoが手間取っている間にこっちは順調にやってるぽい?
まだ最適化のステージがgccには及ばない部分もあるかもしれない。
まだちょっとバグがあるけど、もう一歩で実用的になりそうな気配が。
結構appleがコミットしてるな。

offline optimizationとやらがいまいちよくわからないけど、
apiで簡単に使えるようなフレームワークがあるのかな?
llvm-gccで直にコンパイルしたらバイナリサイズが結構でかいんだが、
中に実行時最適化の為のコードが入ってるのかな。
どういう手順で使うのが普通なんだろ。
0060デフォルトの名無しさん2007/11/08(木) 01:50:43
http://osnews.com/story.php/18889/Kaleidoscope-Implementing-a-Language-with-LLVM/
ちょうどなんかフロントエンド向けのチュートリアルがupされた模様。
0061デフォルトの名無しさん2007/11/08(木) 01:58:46
offlineってのはruntimeじゃない時。
compile-timeでもlink-timeでもない。
インストールした直後とか、利用者に指示された時。
0062デフォルトの名無しさん2007/11/09(金) 18:40:12
QT
0063デフォルトの名無しさん2007/11/09(金) 19:35:45
llvm-gcc4をcygwin上でbuildできた人はいる?
stage2でerrorになるのだが…

どうも、stage1で作ったxgccの動作確認で失敗してるみたい。
空のmain関数だけのtpをxgccでcompileして実行するとseg. faultで落ちる。
生成したアセンブリを見ると、spを変な値に設定してるようだ。
0064デフォルトの名無しさん2007/11/10(土) 12:03:13
cygwinじゃないけどcflagsに何かmarchあたりの設定してるとビルドできなかった。
0065デフォルトの名無しさん2007/11/12(月) 02:09:17
モノによっては

-mtune=k7

とか、mtune指定するとダメなやつもあったり
そもそも-marchやるだけでダメなやつもあったり
-targetとか、あそこらへん指定すると cannot build executable とか出くさるものもあったり
0066デフォルトの名無しさん2007/11/12(月) 20:43:38
demand pagingってオプションやプラグマとかで
無効化できないものでしょうか?
0067デフォルトの名無しさん2007/11/12(月) 21:39:39
どのdemand pagingのことを言っているのかは知らないけど、
ふつうはOSの機能なんじゃないの?
0068デフォルトの名無しさん2007/11/12(月) 21:41:35
VM?
0069デフォルトの名無しさん2007/11/13(火) 17:21:26
gccでexitをフックするにはどうしたらいいでしょうか?
segmentation faltとかならgdbで場所を把握できるんですが,
exitで普通に終わってしまって..
0070デフォルトの名無しさん2007/11/13(火) 17:37:52
at_exit?
0071デフォルトの名無しさん2007/11/13(火) 18:29:12
>>69

(gdb) b exit
(gdb) b _exit

では止まらないと申すか。
0072デフォルトの名無しさん2007/11/16(金) 17:40:13
#include <stdio.h>
#include <sys/types.h>
int main(void) { printf("%d\n",sizeof(size_t)*8; return 0; }

例えば上のようなプログラムでは
/usr/include/libのどのファイル使って実行ファイルを
作成するんでしょうか
できれば調べ方なんか知りたいですが
0073デフォルトの名無しさん2007/11/16(金) 18:00:07
>>72
gcc -v foo.c とか、
ldd 実行ファイル とか
0074デフォルトの名無しさん2007/11/16(金) 19:04:28
>>72
リンカにマップを吐かせると...
0075デフォルトの名無しさん2007/11/17(土) 01:31:03
1つ質問なのですが、ここで良いでしょうか。

OSはFreeBSD6.3-PRERELEASEで、C言語の勉強をしていました。
ソースは酷い有様なのでエラーが多発するのは分かるのですが、
何かいつもと違うメッセージが出まして・・・。
最後の3行が(手書きですが)

cc: Internal error: Segmentation fault: 11 (program ld)
Please submit a full bug report.
See <URL:http://gcc.gnu.org/bugs.html>; for instructions.

と書いてありました。
これってどうしたら良いでしょうか。
放っておけば良いとは思うのですが、気になったものでして。
007675です2007/11/17(土) 02:44:26
すみません自己解決しました。原因が分かりました。
コマンドを間違えて打っていました。
いつもは
cc -o (実行ファイルの名前) (ソースファイル)
で打っていたのですが今回
cc (実行ファイルの名前) (ソースファイル)
と打ち込んで実行していました。

お騒がせしました。
0077デフォルトの名無しさん2007/11/18(日) 00:09:24
>>69
どうなった?

>>74
マップは関係なくね?
0078デフォルトの名無しさん2007/11/18(日) 10:31:12
大有りだろ
何がリンクされたか一目瞭然じゃん
0079デフォルトの名無しさん2007/11/18(日) 12:19:24
最近の子はマップファイルの出し方も知らんのかね?
0080デフォルトの名無しさん2007/11/18(日) 17:31:38
-pthreadと-lpthreadの違いって何ですか?

個人的には常に後者を使ったほうがわかりやすいと思うんですけど
なんでライブラリなしのオプションがGCCにあるのでしょう?
0081デフォルトの名無しさん2007/11/18(日) 17:39:45
>>80
単にライブラリをリンクするだけじゃ対応できない部分があるので、
gcc的にもちゃんとthreadをサポートしてくれる(かもしれない)オプション。
0082デフォルトの名無しさん2007/11/18(日) 18:31:14
>>80
実際に試してみれば判るけど、若干できたバイナリに違いがあるから
特に指定のない限り-pthreadの方がいいと思われる。
0083デフォルトの名無しさん2007/11/18(日) 18:40:24
HP-UXとか要注意な。infoかソース読んで。

gccはスレッドローカル変数とかあって、
ライブラリに全部頼るわけにいかない部分もあるし。
0084デフォルトの名無しさん2007/11/18(日) 20:23:57
誰も-pthreadについて具体的な事を語らない罠。
ま、infoにも詳しい情報ないししょうがないとは思うがw
0085デフォルトの名無しさん2007/11/18(日) 20:38:29
出来損ないOSではつけないとイカンようですな
0086デフォルトの名無しさん2007/11/18(日) 20:45:18
正直あまり意味のないオプションだからね。今となっては。
#include <pthread.h>と-lpthreadで全て済んでしまう。
0087デフォルトの名無しさん2007/11/18(日) 20:45:45
>>81でFA出てるじゃん。
gcc的にも、というだけじゃなくOS(ライブラリ)的にもだけど。

>>85
gccで-pthreadまたは-pthreadsオプションがあるOSは
Linux, Darwin, *BSD, System V, HP-UX, AIX, Solaris
があるが、これら全て出来損ない? w
0088デフォルトの名無しさん2007/11/18(日) 20:52:13
そうだよ
完璧なOSはWindowsのみ
0089デフォルトの名無しさん2007/11/18(日) 21:11:55
つけてもつけなくても同じ、
と
つけないと正常に動作しない、
は全然違うぞ。

んで、出来ソコナイはどれ?Linuxは違うな。
0090デフォルトの名無しさん2007/11/19(月) 00:14:11
リンカ言うと、変な四角い顔したタレントが思い出されて嫌である。
0091デフォルトの名無しさん2007/11/19(月) 01:30:12
>>87
OSじゃなくてarch依存じゃなかったか。

それと、gccのinfoにはプリプロセサとリンカにマルチスレッドプログラムのコンパイルを行なっていることを伝えるオプションだと書いてあるだけで、実際に何が変化するのかは書いてなくない?
-D_REENTRANTとの関係も教えてくれ。i386のLinuxの話でいいから。
0092デフォルトの名無しさん2007/11/19(月) 01:37:08
具体的に語る人を待とう。
>>87 には無理そうだが。
0093デフォルトの名無しさん2007/11/19(月) 09:38:34
Sunとかのコンパイラの-mtみたいなもんだろ。
0094デフォルトの名無しさん2007/11/19(月) 14:48:55
とうとうここも低能のアホレス来るようになったか。
0095802007/11/20(火) 11:24:03
おいらの質問で場が荒れたみたいですんませんでした。
レスをくれた人どうも。

とりあえずi386 GNU/LinuxのGCC -pthreadすると
プリプロセサで#define _REENTRANT 1が定義されますね。
あとはリンカで-lpthreadやってるだけなのかなあ。
0096デフォルトの名無しさん2007/11/20(火) 11:28:40
なぜこういうことを聞いたかってのは下の記事
「pkgconfigとlibtoolの悪」
http://udrepper.livejournal.com/19395.html
で、-pthreadしてると-Wl,--as-neededが効かなくなるぞって話です。

で、pkgconfig/*.pcを検索してみたら-pthreadをしてるのはQt関連とgthreadだけ。
だったら、-pthreadを-D_REENTRANT -lpthreadで置き換えられないかなあ
と思って聞いたわけです。

ただ、たとえそうしてもLDFLAGS=-Wl,--as-neededをやるとコンパイルできない
プログラムなんかもあったりして不思議ですが。
0097デフォルトの名無しさん2007/11/20(火) 16:57:23
>>87
Linuxのmanでは「-pthread」はFreeBSD固有のオプションってなってるけど。。。
0098デフォルトの名無しさん2007/11/20(火) 19:09:19
>>97
偏屈なmanだな。
OSXでman gccしたらRS/6000andPowerPCのオプションに書いてあるな。
i386にはないんだろうか。
0099デフォルトの名無しさん2007/11/20(火) 19:56:01
>>98
Fedora 8に入ってるmanを見てみました。
gcc-4.1.2のマニュアルだと、
IA-64 Option, RS/6000 and PowerPC Options, SPARC Options
に書いてあります。

FreeBSD固有って書いてあるのは、Linux日本語manだけど、gcc-2.95.3の翻訳だから今となっては古い。
0100デフォルトの名無しさん2007/11/21(水) 00:06:24
freebsdのスレッド対応ってまともになったん?まだグダグダ?
0101デフォルトの名無しさん2007/11/21(水) 13:55:08
まともだよ。
ただGPLがらみでgcc止めるとか言い出している人いるから、
また諸々ぐだぐだになるかも。
■ このスレッドは過去ログ倉庫に格納されています