GCCについて part8at TECH
GCCについて part8 - 暇つぶし2ch596:デフォルトの名無しさん
08/09/07 18:38:50
>>592
根本はとってもシンプル
結局はバイナリ公開したければソース出せボケ
いろいろな抜け道を塞ぐために条文追加するはめになっただけのこと

ストールマンの最初の動機と何も変わってないw
思想先行どころか実利的なGPL

597:デフォルトの名無しさん
08/09/07 18:55:43
>>591
d3d9x.libはOSのライブラリってこと?スタティックなライブラリが?
話が唐突で全然意味がわからん。
てっきり、GCC用のLGPLなライブラリだと思ったんだが。

あと、GPLならGPLが適用されるし、LGPLならLGPLが適用されるっしょ。
OSがプロプラとか関係無い。

598:デフォルトの名無しさん
08/09/07 19:54:20
すくなくともd3d9x.libについて調べればそういう話は出てこないとおもう。
簡単に言えば、Direct3Dについてくる、MSの3Dライブラリみたいな。

599:デフォルトの名無しさん
08/09/07 20:26:57
例えば、GPLな数値計算ライブラリと
Direct3D の組み合わせで計算結果を視覚化するソフトウェアがあるとする
このソフトウェアを α とする

α 内で使用されている D3DX* 系の関数は DirectX SDK の d3dx9.lib スタティックライブラリに含まれている
スタティックライブラリに含まれる部分のソースが無いので
出来上がった α を頒布することはできない

これで合ってる?

600:デフォルトの名無しさん
08/09/07 20:37:12
>>591
それが詭弁に過ぎないことは世の中のWebブラウザを見てればわかる

601:599
08/09/07 21:11:52
>>599はgcc関係なくて、GPLについてだけなのでスレ違いっぽいですね

602:デフォルトの名無しさん
08/09/07 21:23:56
>>600
わからん。具体的には?

603:デフォルトの名無しさん
08/09/07 21:46:58
mingwのgccがなかなか4系列にならないのはなんで?

604:デフォルトの名無しさん
08/09/07 22:11:01
>>603
4系列だとpchのテストが通らないからとか?

605:デフォルトの名無しさん
08/09/08 05:30:18
>>598
あー、d3dx9.libの事を言いたかったのか。
てっきり、d3d9x.libっていうCygwin用のdllラッパーか何かかと思った。

じゃあ、>>584は何を困ってんだ?自作ツールを公開したいってことか?

606:デフォルトの名無しさん
08/09/08 13:47:08
d3dx9.lib ってスタティックリンクライブラリなの?
DLL用インポートライブラリじゃなくて?

607:デフォルトの名無しさん
08/09/08 13:48:05
スタティックリンクライブラリ

608:デフォルトの名無しさん
08/09/08 14:24:42
そうなんだ。Thx!

609:デフォルトの名無しさん
08/09/08 21:32:03
GCC4.4 が stage 3 になったな

610:デフォルトの名無しさん
08/09/09 04:06:10
どちらにしろOSの機能を使うためにOSベンダが提供しているものは使って大丈夫。

611:デフォルトの名無しさん
08/09/09 05:53:39
GPLの何項にのってるの?
>どちらにしろOSの機能を使うためにOSベンダが提供しているものは使って大丈夫。

612:デフォルトの名無しさん
08/09/09 07:41:32
>> 611
ちょっと前のレスも読めないの?

613:デフォルトの名無しさん
08/09/09 12:00:16
>>612
>>611はGPLを読んだことすらないだろ。読んだことがあるなら
述べる主題によって項が立てられているのだから>>611みたいなこと
いちいち聞くまでもないと理解しているはずだから。

614:デフォルトの名無しさん
08/09/15 22:04:22
組込み以外で、何度もオブジェクトを小グループ単位で
スタティックリンクし、最後にlibxxxx.aを作る利点というと
何が思いつきますか


615:デフォルトの名無しさん
08/09/16 01:15:36
libxxxx.aを作るのはスタティックリンクちゃいますえ

616:デフォルトの名無しさん
08/09/16 01:21:56
libxxxx.aの中の関数を置き換えられる

617:デフォルトの名無しさん
08/09/25 21:01:57
C++のコードを-Weffc++を付けてコンパイルしたら、警告が出まくった男がいたんですよー。

よく見るとSTLのヘッダーファイルから発生してるやないかー
俺のせいちゃうやんけー

男は黙って ただの配列

618:デフォルトの名無しさん
08/09/28 18:19:32
export CPPFLAGS="-fprofile-genereate"
export LDFLAGS="-fprofile-genereate"
make


PGOつかいたいんですけど、
上のとおりにやったらcc1.exeっていうのが
-fprofile-genereateなんてしらねーよ!って怒るんです。

619:デフォルトの名無しさん
08/09/29 00:39:23
そりゃそうだろ。

620:デフォルトの名無しさん
08/09/29 03:46:49
gcc (GCC) 4.1.2(Linux)では、
構造体の代入はmemcpyを呼んじゃうもんなんですか?
32bitマシンでは4バイトずつのコピーを期待していたので。

621:デフォルトの名無しさん
08/09/29 05:55:21
>>620
gcc 4.3 or laterを使いましょう。

622:デフォルトの名無しさん
08/09/30 07:48:17
gcc って、-g で最適化(-O2など)が阻害されるようなことがあるの?
ずっとないと思ってたけど、気になってきた。

623:デフォルトの名無しさん
08/09/30 08:33:04
>>619
何でですか?


624:デフォルトの名無しさん
08/09/30 08:34:55
>>621
ありがとうございます。試してみます。

625:デフォルトの名無しさん
08/09/30 08:38:57
>>618
-pg
でどう?

626:デフォルトの名無しさん
08/09/30 09:10:50
>>623
目が腐ってるの? 頭が腐ってるの?

627:デフォルトの名無しさん
08/09/30 09:29:35
genereateってどういう意味だw

628:デフォルトの名無しさん
08/09/30 11:04:06
ニートだから最後は延ばしたくなるんだろうな。

629:Google先生
08/09/30 11:07:56
fprofile-genereateの検索結果 2 件中 1 - 2 件目 (0.52 秒)
もしかして: fprofile-generate

630:デフォルトの名無しさん
08/09/30 15:12:33
よくみたらスペル違うじゃないですか!!!!!!!!
↓のコピペしたから気付きませんでした><
URLリンク(d.hatena.ne.jp)

631:デフォルトの名無しさん
08/09/30 17:12:30
>>622
stripしてdiffしたら

632:ニート009
08/09/30 22:34:27
stripって何?

633:デフォルトの名無しさん
08/09/30 22:47:34
実行ファイルからデバッグ情報を取り除くこと

634:デフォルトの名無しさん
08/11/03 13:41:03
sh4-linux を組み込む クロス環境を作成中で、
binutils-2.19 ← 成功
gcc-3.4.6(ブートストラップコンパイラ) ← 成功
glibc-2.5 ←ここでこける
完全なsh4-gccの構築 ← ここへはたどり着けない


CC=sh4-linux-gcc ac_cv_type_long_double=no ../glibc-2.5/configure \
--host=sh4-linux --prefix=/root/sh4/tools/sh4-linux/ \
--enable-add-ons=linuxthreads --with-headers=/root/sh4/tools/include/ \
--disable-sanity-checks --disable-shared | tee sh4config.log

configureは成功するよ

makeすると・・・・

/root/sh4/tools/bin/../lib/gcc/sh4-linux/3.4.6/../../../../sh4-linux/bin/ld: cannot find -lgcc_eh

上のエラーが出てmakeが途中でストップ。

gcc-ehとはldによって呼び出されるもの?と思いました。
どのような役割があるのでしょうか?
gccコンパイルする時に生成されなかったのかな?

既存のshクロスrpmをインスコすればいいのですが、クロス環境の学習目的です。
参考書籍は「組み込みlinuxシステム構築」を読んでます
よろしくおながいいたします。




635:デフォルトの名無しさん
08/11/03 16:03:02
crosstoolとかcrosstool-NGのスクリプト読んでみるといいよ

636:デフォルトの名無しさん
08/11/03 16:41:20
>>634
make lib

637:デフォルトの名無しさん
08/11/03 17:26:06
URLリンク(svn.exactcode.de)

638:デフォルトの名無しさん
08/11/03 23:40:27
まだうまくいかないけど、参考になりました。
コンフィグオプションももっと調べないと・・・

639:デフォルトの名無しさん
08/11/12 20:15:10
gcc の引数って順番の依存あります?

gcc hoge.c mylib.a



gcc mylib.a hoge.c

ってかいたとき、Darwin の gcc だとどちらの書き方でも a.out ができるんですが、
Ubuntu の gcc だと、後者の書き方ではリンクエラーになるんです。



640:デフォルトの名無しさん
08/11/12 20:22:44
順序に意味はあります。

リンク時の名前解決において、先に現れたモジュールで未解決の名前を、
後で現れたモジュールで解決するので、これが逆になって、
先に現れたモジュールに定義があって、後から参照する形になると、
名前が解決できなくなります。

641:デフォルトの名無しさん
08/11/13 00:06:49
>>639
Darwinのgccはldとは別のリンカ使ってる。(dyld)
DarwinはELFやBSD a.out形式じゃないから。(Mach-O)

642:デフォルトの名無しさん
08/11/22 12:58:43
>>603-604
じゃあコンパイラとしての能力には深刻な問題があるわけではない?

643:デフォルトの名無しさん
08/11/22 18:48:12
>>642
pchの問題は4.3だと解決してるみたい。

644:デフォルトの名無しさん
08/11/25 20:34:44
OS CentOS4.6 i386
gcc 3.4.6

やりたいこと
binutils-2.10.tar.gz
gcc-2.95.2.tar.gz
glibc-2.1.3-armlinux.tar.gz
を使ってクロス環境を作りたい

bintilをビルドする時に
./configreでホストのタイプを設定したいのですが、Centの場合
--host=i386-unknown-linux
でいいのでしょうか?

645:デフォルトの名無しさん
08/11/25 20:42:29
binutilsとgccはとくにhostの指定はしなくてもいいけど

646:デフォルトの名無しさん
08/12/01 12:39:07
書くとすれば、i386-pc-linux-gnu だよな。



647:デフォルトの名無しさん
08/12/01 17:08:01
gcc -dumpmachine

648:デフォルトの名無しさん
08/12/18 01:48:00
OS:CentOS
コンパイルすると
無効なプリプロセスディレクティヴ #!
ってでるんだ 誰か解決策を教えてください。

649:デフォルトの名無しさん
08/12/18 02:09:29
エスパー求む

650:デフォルトの名無しさん
08/12/18 02:23:45
シェルスクリプトをコンパイルしてはいけません

651:デフォルトの名無しさん
08/12/18 02:28:22
実は1行目が#!ccだったりしてw

652:デフォルトの名無しさん
08/12/21 15:44:40
g++のコンパイルが異常に遅くなってしまってるんですが、
何がボトルネックになっているのかを調べる(コンパイラ自身のプロファイルみたいなの)
はありますか?

コンパイルしているのは、ユニットテスト的なテストプログラムで、
長さも100行程度です。ひたすら関数の結果をチェックしまくるみたいなもので、
マクロを使いまくっているんですがそれが原因かなぁ・・・

653:デフォルトの名無しさん
08/12/21 15:45:39
書き忘れましたが、その100行程度のユニットテストプログラムで、
コンパイルには3分くらいかかってます。

本体プログラムよりはるかに長い・・・orz

654:デフォルトの名無しさん
08/12/21 15:51:45
可能なら前半と後半で2つのモジュールに分けて、どっちで遅くなるか調べる。
それを繰り替えして突き止めるとか。最終手段かもだが。

655:デフォルトの名無しさん
08/12/21 16:01:17
-Eだとどれくらいかかってるんだろ?

656:デフォルトの名無しさん
08/12/21 16:08:56
1. -E, -S, -cでそれぞれの時間を確かめる。
2. cc1内部は-fdump-rtl-allで出力ファイルのタイムスタンプを見る

657:デフォルトの名無しさん
08/12/21 16:32:33
>>654 >>655 >>656
あざっす。いまからいろいろ調べてみます。

658:デフォルトの名無しさん
08/12/21 17:10:27
templateでたらいまわし関数みたいなものを作っているとかだったり。

659:デフォルトの名無しさん
08/12/21 17:21:19
>>658
テンプレートをガンガン使ってるなら、まぁ遅くなっても納得するんですが・・・

コンパイルしているプログラムが、
ASSERT_TRUE( .xxxx )
ASSERT_TRUE( yyyy )
みたいなものが延々と続いているだけのプログラムなので不可解なのです

660:デフォルトの名無しさん
08/12/21 18:25:36

time コマンドで実行時間を測定しました。

-c  81.34s user 12.30s system 97% cpu 1:35.78 total
-S  82.63s user 11.62s system 99% cpu 1:34.66 total
-E  0.36s user 0.17s system 99% cpu 0.533 total

それぞれ一回しかやってないのでちょっと揺れがありますが…
つまり-Eは一瞬で、asに時間がかかっているという解釈で正しいんでしょうか?

ひょっとしてプリプロセッサによってファイルが膨れ上がっているのかとも思いましたが、
他のファイルでも-E 後の行数はほぼ同じだったので、単純に行数が原因ではないようです。
(すべて 50k~60k行の範囲内)

次に-fdump-rtl-allを付けてコンパイルしようとしましたが…
ディスク領域不足でコンパイル中断しましたとか出る上に30分経ってもまだ終わらない…

661:デフォルトの名無しさん
08/12/21 18:30:50
アサートの数を減らしてみて
どこを減らせばどのくらい時間が変わるか見てみたら?

662:デフォルトの名無しさん
08/12/21 18:35:33
> つまり-Eは一瞬で、asに時間がかかっているという解釈で正しいんでしょうか?

どう見てもcc1だろ時間かかってるのは。

-Q ってオプションがあるので試してみ。

663:デフォルトの名無しさん
08/12/21 19:00:41
-Sの時間が-cよりかかってるってことは、コードが相当大きくなってる?

664:デフォルトの名無しさん
08/12/21 19:51:11
プリプロセスだけして出てきたコードはどれくらいになっとるかね

665:デフォルトの名無しさん
08/12/21 20:20:12
どんな最適化しているの?
でかいファイルでインタープロシージャルな最適化まで
やったら結構重くなるだろ。

666:デフォルトの名無しさん
08/12/21 20:34:10
>>663
これは誤差範囲だと思います。一回しか測定してないので

>>662
-Q を試してみます。

#if 0 したりしていろいろ測定してみました。どうも、ASSERT_XXXXの個数と
だいたい相関があるようなので、1つ1つのコンパイルが遅いような気配です。
マクロの中身を減らせないかどうか検討中です。

667:デフォルトの名無しさん
08/12/21 20:35:40
アサートマクロの実装がマズかったりすんじゃないのかね。意外と。

668:デフォルトの名無しさん
08/12/21 20:37:50
>>664
プリプロセス後のコードは50k行程度です。
一般的に見て多いのか少ないのかよくわからないですが、
他の、数秒でコンパイルが終わるような同列のソースファイルも
行数はさほど変わらないので、行数そのものは関係ない気がしています

>>665
autoconfまかせだったので、-O2の最適化がかかってました。
テストコードだし、-O0にしてみます


669:デフォルトの名無しさん
08/12/21 20:40:14
>>668
ヘッダファイルの部分を除いた行はどのくらい?

あと、マクロは常に1行に展開されるので、
単に行数だけ見るより、バイト数見た方がいいかもしんない。

670:デフォルトの名無しさん
08/12/21 21:24:47
>>660
システムタイム大きすぎ!ほとんどI/Oだろ。
-vでcc1の引数見て、テンポリファイルの中見てみ。
超巨大になっているに違いない。
もしかしてtemplate引数に正定数の荒しで特殊化爆発?

671:デフォルトの名無しさん
08/12/22 00:29:25
-pipe してみて改善するようなら、特殊化の嵐でオブジェクトサイズがとんでもないことになってて
I/Oで時間喰ってるんじゃない?コンパイル中にメモリとスワップがどうなってるか見てもいいかも。
今時のマシンでcc1plusに80秒以上とか・・・。gccのinsn-*.cのコンパイルはそのくらいかかってたけど。

672:デフォルトの名無しさん
08/12/22 08:34:32
gdbでさ、

struct foo;
struct foo { ... };

と構造体の前方宣言があると、先に見つけた定義を見てしまって構造体の中身を
print でダンプできず <incomplete type> になってしまうのだけど、結局
これって解決不能なの?

毎回同じ構造の別名構造体をダミーで仕込んで、変数ごとにキャストして
アクセスとかって超面倒なんだけど。


673:670
08/12/22 09:53:03
まさに的を射たと思ったんだが反応がない(ワラ

674:デフォルトの名無しさん
08/12/22 15:45:05
>>673
反応遅れましたが、前にも書いているとおりテンプレート一切使ってないんです。
(boost::scoped_ptrは使ってますが、それはほかの異常ない部分でも一緒なので)

特定のどこかが遅いということではなく、調子のってマクロを使いすぎて
ソースの量が爆発しているような気配です。
地道にマクロを削って最適化を抑止して頑張ってます。

675:デフォルトの名無しさん
08/12/22 23:50:26
>>672
ちょっと簡単な例でやってみたら別に問題ない。 具体的なサンプルコードよろ。

676:デフォルトの名無しさん
08/12/23 00:02:54
gdbはinfoのどこかに、関数のプロトタイプ宣言書くなら、
ファイルのはじめの方に書きなと書いてあって笑った記憶があるが…

677:デフォルトの名無しさん
08/12/23 00:10:56
>>675
具体的なコードはちょっと出すの難しい。Linuxの動作を
gdb -c /proc/kcoreで追いかけてたら途中で<incomplete type>になる構造体が
出てきたという経緯で、自分のコードじゃないから。

- URLリンク(stackoverflow.com)
- URLリンク(sourceware.org)

あたりがソースかな。gdb struct incomplete type でググると同様の話がゾロゾロ出てくる。

678:デフォルトの名無しさん
08/12/23 01:16:19
>>677
- URLリンク(sourceware.org)

1998年? お前バカか? そんな古い断片の情報で>>672みたいな結論出すなよ。
その状況は今のgcc/ldでは起こらない問題。 >>675というのはカーネルモジュールとか
特殊なリンク環境で起こるんじゃないか? あと、

- URLリンク(stackoverflow.com)

は前方参照のことは何も書いてないぞ。 本当に>>677で見たコードには前方参照があったのか?
単にopaqueな参照だったんでは?

679:デフォルトの名無しさん
08/12/23 11:23:39
>>678
古い記事を出してしまったのはすまない。

最近(2006年あたり)でも類似の話があるので出してしまったのだけど、
ちょっと込み入った話なので質問撤回します。お騒がせしてすみません。


680:デフォルトの名無しさん
09/01/18 15:18:11
EclipseからMinGWを呼び出してC言語のプログラムを書いているのですが、
"-ansi"オプションを指定しても、なぜかC99の機能が使えて困っています。
具体的には、配列の動的確保がなぜかできます。(↓のような機能)

int i = 10;
int array[i];

他のC99の機能(新しいコメント分の書式やfor文での変数初期化)は無効になっていますので
これはバグなんでしょうか?
ちなみにgccのバージョンは、「gcc (GCC) 3.4.5 (mingw-vista special r3)」です。

681:デフォルトの名無しさん
09/01/18 15:34:24
>>680
-std=c89


682:デフォルトの名無しさん
09/01/18 16:04:32
>他のC99の機能(新しいコメント分の書式やfor文での変数初期化)は無効になっていますので
むしろこっちの方がバグなんじゃ

683:デフォルトの名無しさん
09/01/18 16:07:37
>>682
C89+GCC拡張なんじゃね

684:デフォルトの名無しさん
09/01/18 16:11:42
-ansi 指定してもその程度なのか。
やはり -pedantic-errors -Wall をつけないとダメなのか。

685:デフォルトの名無しさん
09/01/18 16:19:34
>>681
できました!!ありがとうございます!

686:デフォルトの名無しさん
09/01/18 16:27:04
バグ呼ばわりか

687:デフォルトの名無しさん
09/01/18 16:33:50
他のコンパイラで使う時に困るので、けったいな独自拡張はやめて下さい。

688:680
09/01/18 16:38:49
>>681
できたと思ったのですが、またもや可能になってしまいました。
どうやらMinGWではなく、Eclipseのプラグインにバグがある気がします。
お騒がせいたしました。

689:デフォルトの名無しさん
09/01/18 16:40:10
だからpandanticだって

690:デフォルトの名無しさん
09/01/18 16:46:42
>>688
-std=c89 -pedantic-errors -Wall

691:680
09/01/18 16:52:34
>>689-690
ありがとうございます、今度こそ表示されたようです。
レスも良く読まずにすみませんでした。

692:デフォルトの名無しさん
09/01/18 17:02:14
全ては自分以外のバグが原因だからなw

693:デフォルトの名無しさん
09/01/18 17:21:14
しかもレスもよく読まない。


694:デフォルトの名無しさん
09/01/25 11:07:08
4.3.3

695:デフォルトの名無しさん
09/02/01 04:57:11
gcc 4.3.3のビルド・インストールをしたのですが、
間違えて、prefix=/usrにしてしまっていたのですが、
一度、アンインストールしたいのですが、
どうすればいいでしょうか?

696:デフォルトの名無しさん
09/02/01 05:52:47
以前入れてたバージョンを再ビルドすればいいんじゃねえの?

697:デフォルトの名無しさん
09/02/01 17:56:31
>>695
GCCにあったかどうか記憶してないけど
make uninstall
が効くかもしれない

698:デフォルトの名無しさん
09/02/01 18:29:08
>>695
もう一回make installして、何をinstallしたかファイルに保存

手作業

cppに依存しているものも結構あるから、
普及する前にrebootしない方がいい。

699:デフォルトの名無しさん
09/02/01 20:48:45
その作業を自動化するスクリプトって書けそうだけど

700:デフォルトの名無しさん
09/02/01 21:13:35
INSTALL変数を上書きすればいいと思うけど、
まあ結局、目でチェックする必要あるから。

701:デフォルトの名無しさん
09/02/01 22:26:38
/usrにある既存環境上書きしてるはずだから、単純にアンインストールすると酷い目に合いそうな気が。
1) インストールされたファイル/ディレクトリの一覧を作る。
2) 標準のパッケージでインストールされるファイル/ディレクトリの一覧を作る。
3) 標準のパッケージを再インストール。
4) (1)に有って(2)に無いファイル/ディレクトリを消す。
これくらいやる必要あるんじゃない?

702:デフォルトの名無しさん
09/02/01 23:04:32
>>698にあるcppと
C++もインストールした場合のlibstdc++くらいじゃないかな。
システムのクリティカルなところに使われてる可能性あるのは。
ld, libcは入ってないし、crt関係はsoじゃないし。

703:デフォルトの名無しさん
09/02/06 07:01:03
>>695
ちなみにGCCのmake uninstallは効かない。それとprefix=/usrだったらまずディストリ標準の/usr/bin/gcc同じくg++,c++や
cppやgcjなどが完全に上書きされてる。フォートランは違う名前かもしれん。

一番問題は多分/usr/libのlibstdc++が上書きされてる点かな。下手するとgcc4.3入れたその前後にmakeしたアプリなどが
動かなくなるかも。てか運が悪いと既にそこへ入れた時点でlibstdc++の関連で動かなくなるアプリとか出るときあるお。

結果から言うと自分で手作業で探して削除した後、再度デフォルトで入ってたgcc系とlibstdc++のパッケージを再インスコ。
ぶっちゃけ手作業で削除しなくても多分gcc系とlibstdc++の再インスコで上書きされるから平気だと思うよ。
ただしgcc系ってのはgcc,c++,cpp,gcj,fortlanあとなんかあったような気がするけど忘れたw まあその辺全部再インスコね。
そうすれば手作業で消さなくても問題無い位復旧できるはず。

まあ違うバージョンのgccは/optとかにインスコしといた方が無難。/optにおいてもldがちゃんと機能してればlib関連は
/opt/gcc***/libを見に行くはずだから。

704:デフォルトの名無しさん
09/02/06 07:52:50
OS再インストールした方が早かったりしてね。

705:デフォルトの名無しさん
09/02/06 14:10:12
基本的に複数バージョン同居できるようになってるからそこまで大変じゃない。
パッケージからgcc関連入れ直して/usr/include/c++/4.3.3、
/usr/lib/gcc/$target/4.3.3、/usr/libexec/gcc/$target/4.3.3を消せば大丈夫。

706:デフォルトの名無しさん
09/02/07 05:26:51
スレリンク(tech板:350番)
325>>理由教えて。

707:デフォルトの名無しさん
09/02/07 08:58:49
>>706
向こう見に行くの面倒だから、聞きたいポイントを整理して書け。

708:デフォルトの名無しさん
09/02/07 12:22:48
お疲れ。
double func(double a, double b){double c; return (a+b);}
でreturn (a+b);
とc=a+b;return c;の違いは何?

709:デフォルトの名無しさん
09/02/07 13:12:02
>>708
浮動小数点な数値のプロセッサ内での保持方法の差だっけ。
どっかのブログでSunの科学計算の手引きみたいなページが紹介されてた。


710:デフォルトの名無しさん
09/02/07 13:30:28
参考にさせてもらいます。
> gcc
URLリンク(kansai2channeler.hp.infoseek.co.jp)
を、これで修正したら動いた理由が知りたいのですが。
スレリンク(tech板:350番)

711:デフォルトの名無しさん
09/02/07 14:17:01
どうやら、fld dword ptr 抜けが原因らしいです。
gcc version 3.4.4 (gcc Win/on Win2000)
では、戻り値がdoubleの関数は、return 文の所で
演算していはいけない。必ずglobalかlocalの変数に結果を入れてから、
return 変数名;
としないと、いけないようだ。

712:デフォルトの名無しさん
09/02/07 15:03:28
>gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
無問題。

713:デフォルトの名無しさん
09/02/07 15:13:02
gcc に-O3 のオプション付きでなら良いみたい。

714:712
09/02/07 15:14:01
つけてもつけなくても8228.cで問題が出ない。

715:713
09/02/07 15:29:08
そうですか、こちらのPCはLavie C LC60H 確か32bitです。
exeか、逆アセンブル結果でも、掲示板に張って送ります?
-O3 無し
=7>=====
00401050 push ebp
00401051 mov ebp, esp
00401053 fld qword ptr [ebp+10h]
00401056 fadd qword ptr [ebp+18h]
00401059 fadd qword ptr [ebp+20h]
0040105C pop ebp
0040105D ret


716:712
09/02/07 15:53:53
それの何が問題だと言いたいのか判らない。
--8228.s:total()
_total:
pushl %ebp
movl %esp, %ebp
fldl 16(%ebp)
faddl 24(%ebp)
faddl 32(%ebp)
popl %ebp
ret
--
確かに-O3つけたらインライン展開されるから関数自体見えなくはなるけど。

717:713
09/02/07 16:01:34
fadd した結果が消えて、return値にセットされているか?
fadd の次はpopなので、結果の値が消えるのでは。

718:デフォルトの名無しさん
09/02/07 16:03:10
はぁ? 何を寝ぼけたことを。

719:デフォルトの名無しさん
09/02/07 16:04:29
・faddした結果はどこに格納されるか
・pop ebpは何をどこに戻すか
・doubleの戻り値はどこに格納されるか

少し勉強してこい。

720:713
09/02/07 16:28:54
すみません。
それで、問題はfunction側に有るのでは無くて、call側です。
戻ってきた直後で、ストアじゃなくてロードすると、以前の内容が
レジスタから消えます。

-O3 無し
00401400 call 00401050h
00401405 fld qword ptr [ebp-10h]

721:デフォルトの名無しさん
09/02/07 16:35:22
fldはプッシュなんだよ

722:デフォルトの名無しさん
09/02/07 16:59:47
>>720
数多の天才が気付かずに使っているコンパイラのバグを、浅学無能非才のあんたに見つけられるというのか?
思慮が足りないにも程があるぞ。

723:デフォルトの名無しさん
09/02/07 17:07:29
すみません、exe おいておきます。どうぞ参考に。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

cygwin1.dll version 1005.25.0.0 (0.156 2008-06-12 19:34)


724:デフォルトの名無しさん
09/02/07 17:18:27
Cのソースは?

725:723
09/02/07 17:23:24
どぞ
URLリンク(kansai2channeler.hp.infoseek.co.jp)

726:デフォルトの名無しさん
09/02/07 17:47:35
で、結局何がしたいんだ?
デバッグだったら一人で勝手にやってろよ。
勿論、その場合はスレ違いだ。

727:デフォルトの名無しさん
09/02/07 17:51:49
gccに-O3オプションは必須か?

728:デフォルトの名無しさん
09/02/07 17:53:05
>>727
質問の意図は? >723の言っていることなら只の世迷言だから無視しておけ。

729:デフォルトの名無しさん
09/02/07 17:57:19
>>714

730:711
09/02/07 19:05:31
どぞ

731:デフォルトの名無しさん
09/02/07 19:47:18
ソートでスタック喰いつぶしるような?

732:711
09/02/07 19:57:07
戻り値を一旦変数に代入すれば大丈夫?

354 :325 :2009/02/07(土) 04:54:11
>>326
double a;

do{
while((a=total(st[pl])) > x) pl++;
while((a=total(st[pr])) < x) pr--;

355 :325 :2009/02/07(土) 05:01:10
>>326
double a;

do{
pc = (pl + pr) / 2;
if((a=total(st[pc])) == key)
return pc;
else if((a=total(st[pc])) > key)

733:デフォルトの名無しさん
09/02/07 19:58:54
浮動小数点演算ではまった話
URLリンク(0xcc.net)

これかな…?

734:デフォルトの名無しさん
09/02/07 20:08:49
いいえ。8828.cがまともに動かないのは自前で実装したクイックソートが腐っている所為。

735:デフォルトの名無しさん
09/02/07 20:40:06
total関数をコメント側のコードにすると動く。

736:デフォルトの名無しさん
09/02/07 21:19:06
結果がスタック渡しなのに、結果をスタックに書き込んでないからみたい。

737:デフォルトの名無しさん
09/02/07 21:47:30
>結果がスタック渡しなのに
いいえ、FPUレジスタ渡しです。

738:デフォルトの名無しさん
09/02/07 21:50:46
でも、>>720のコードになってる?

739:デフォルトの名無しさん
09/02/07 22:30:25
だから、FPUの勉強してこい。FPUレジスタはFPU内部(と言っても今や単にCPU内部だが)で
スタック上に利用するようになっている。だからfldを繰り返したら複数のレジスタに順に格納されるわけ。

740:713
09/02/07 22:36:24
>>733 参考にしました。結局、gcc 3.4.4はdoubleを使うと「ときどき」桁落ちする。
double total(){return (st.ascore + st.bscore + st.cscore);}
=7>=====
00401050 push ebp
00401051 mov ebp, esp
00401053 fld qword ptr [ebp+10h]
00401056 fadd qword ptr [ebp+18h]
00401059 fadd qword ptr [ebp+20h] ;;結果はFPUスタックに置く(80bit値)
0040105C pop ebp
0040105D ret


if(st[pc].number == key)
00401153 call 00401050h
00401158 fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115B fxch st(1)
0040115D fucompp ;;数値比較(80bit値 : 64bit値)


double a;
if((a=st[pc].number) == key)
00401153 call 00401050h
00401158 fstp qword ptr [ebp-18h] ;;メモリ内容をFPUスタックから出す(sp=sp-1)(64bit値)
0040115B fld qword ptr [ebp-18h] ;;メモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115E fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
00401161 fxch st(1)
00401163 fucompp ;;数値比較(64bit値 : 64bit値)


741:デフォルトの名無しさん
09/02/07 23:22:43
return (st.ascore + st.bscore + st.cscore);

double a = (st.ascore + st.bscore + st.cscore);
return a;
では、吐く汗のコードに違いがあるのですが、何が違うのでしょうか?

742:デフォルトの名無しさん
09/02/07 23:30:28
return (st.ascore + st.bscore + st.cscore);
結果の戻り値の数値が80bit表現

double a = (st.ascore + st.bscore + st.cscore);
return a;
結果の戻り値の数値が64bit表現

743:デフォルトの名無しさん
09/02/07 23:34:10
なるほど。なんとなく、わかりました。

744:デフォルトの名無しさん
09/02/08 00:03:32
GCC関係なく、x86一般の話のようにしか思えない。

745:706
09/02/08 02:51:15
>>744 何告白ってるんだ。
ソフト板 URLリンク(pc11.2ch.net)

746:デフォルトの名無しさん
09/02/08 04:22:49
うぜえ

747:デフォルトの名無しさん
09/02/14 06:48:19
gcc -S でコンパイルしたときにコンパイラオプションをアセンブラソースに出力する
オプションってありますか?

748:デフォルトの名無しさん
09/02/14 07:44:24
-fverbose-asm

749:デフォルトの名無しさん
09/02/14 08:43:07
>>748
ありがとうございます

750:デフォルトの名無しさん
09/03/05 23:15:00
gcc *.c -S
とするとAT&T Syntaxで*.sができますが、Intel Syntaxで出すことはできますか?

751:デフォルトの名無しさん
09/03/06 02:40:48
-masm=intel

間違った命令を吐いてしまうという噂を聞いたことがある。
最近の状況はわからん。

752:デフォルトの名無しさん
09/03/06 11:18:14
>>751 へー。知らんかった

753:750
09/03/06 23:58:24
>>751
tnx

754:デフォルトの名無しさん
09/03/07 00:03:18
生成コードが心配ならgccには普通にオブジェクト作らせて、objdumpに
欲しい方のシンタックスでダンプさせるのはどう?

755:デフォルトの名無しさん
09/03/07 01:37:29
そっちもおかしかったりして。

てことはないと思うが、読みにくくなるからなあ。


756:デフォルトの名無しさん
09/03/07 05:26:47
そもそも噂ってなんだよ?w
毎週snapshotが出て、全世界で最も多く使われているコンパイラが、
判りやすいbugをいつまでもほっとくわけ無いだろ。

最も多く使われている筈のOSは、10年もディレクトリ掴んだまま
放さないbugが取れなくて、たまにイライラするけどな。

757:デフォルトの名無しさん
09/03/07 09:48:26
masmバックエンドって使われてないだろうし

758:デフォルトの名無しさん
09/03/07 11:41:18
組み込み系で結構使われてますよ。> masm=intel
まあnasmでなんとかなる昨今ですが。


759:デフォルトの名無しさん
09/03/07 13:12:36
>>767
なれりゃAT&Tでも特に困らんしなあ。
あれは完全におまけ機能だよなあ。

>>768
たぶんそのmasmは関係無いと思う。


760:デフォルトの名無しさん
09/03/07 15:14:02
>>759
gcc -masm=intel → 組み込み評価ボードのアセンブラ(by Intel)

761:デフォルトの名無しさん
09/03/07 20:13:31
>>759
767と768に期待

762:デフォルトの名無しさん
09/03/12 00:59:10
64bit環境で

gcc -O2でコンパイルする場合と

gcc -m64を付ける場合でゲロったバイナリの内容って異なることは
ありえないですよね?

763:デフォルトの名無しさん
09/03/12 02:22:11
ありえるのでは?
gcc -O2とgcc -m64 -O2が違うのはあり得ないというのならともかく。

764:デフォルトの名無しさん
09/03/30 18:24:57
4.5


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch