• 締切済み

gccのコマンド行オプションについて

現在仕事で、HP-UX11iからLinuxにC言語プログラムを移行する作業を行っています。 そこで、質問なのですが、HP-UXでは"+unum"というコマンド行オプションがありました。 以下がccのマニュアルに記載されている説明です。 ------------------------------------------------------------------------------- ポインタは固有に境界整列していないデータにアクセスできる。 このオプションを使用することにより、コンパイラが間接参照されたデータにアクセスする方法 が変更できる。 また、このオプションを使用すると、生成されたコードの効率が低下することがある。 numについては次のように指定可能。  1:シングルバイトの境界整列を想定する。一連のシングルバイトのロードと保管によって 間接参照が実行される。  2:一連の2バイトのロードと保管によって間接参照が実行される。  4:一連の4バイトのロードと保管によって間接参照が実行される。 ------------------------------------------------------------------------------- この様に、アラインメントの設定だと思うのですが、"gcc"のオプションで同じ性能を持つものってあるのでしょうか? ネットなどで調べても出てこないので、もしご存知でしたら、ご教授ください。 OSの環境、gccのバージョンは以下の通りです。 OS:Red Hat Enterprise Linux AS release 4 (Nahant Update 5) gcc:gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) わかりにくい質問だとは思いますが、よろしくお願い致します。

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

移植先のRed Hatはx86で動作するものですか? それともそれ以外? もしx86ならばアラインメントに寛容なので、そもそもそのようなコンパイルオプションは不要かもしれません。

h05d8023
質問者

お礼

回答ありがとうございます。 >移植先のRed Hatはx86で動作するものですか? それともそれ以外? はい、x86で動作するものに移植をしています。 >もしx86ならばアラインメントに寛容なので、そもそもそのようなコンパイルオプションは不要かもしれません。 あ、そうなんですね! 検索をかけても出てこないのは、特別付加する必要が無かったからなんですね。 まだまだ知らないことが多いですね。。。 勉強になりました!ありがとうございます!

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

一応CPU依存で似たような事ができるオプションはありますが 本当にそれが必要かどうか、必要であるなら必要な箇所を特定して __attribute__((aligned()))や__attribute__((packed))を使用された方がよいのではないでしょうか。

h05d8023
質問者

お礼

なるほど! 一応類似オプションは存在するんですね! やはり、ソースをしっかりと見返す必要がありそうですね。。。 量が多くて少し敬遠していたんですけど、これから頑張って調べてみたいと思います! 回答ありがとうございました!

関連するQ&A

  • gcc 4.1.2 をインストールしたい

    OSは以下です。 ----------------------------------------------------------------------------- OS:Red Hat Enterprise Linux ES release 4 (Nahant Update 6) ----------------------------------------------------------------------------- gccバージョンは以下となります。 ----------------------------------------------------------------------------- gcc バージョン 3.4.6 20060404 (Red Hat 3.4.6-9) ----------------------------------------------------------------------------- 上記のgcc バージョンを 4.1.2 に上げたいのですが、どうすればいいでしょうか? 対象マシンはリモートで操作しており、外部ネットには繋がらない環境に置かれております。 そのため、yum によるインストールができません。 必要なrpmパッケージを対象マシンにアップロードして、rpmコマンドによるインストールを 考えているのですが、どこから必要なファイルをダウンロードすればよいのか わかりません。 過去の質問から以下のサイトを見つけましたが、どのファイルが redhat で実行できるのか、 わかりません。 http://rpm.pbone.net/index.php3?stat=3&limit=1&srodzaj=1&dl=40&search=gcc4&field[]=1&field[]=2 ソースからインストールできるのならば、その方法でいいです。 どなたか、方法をご教示願います。

  • gcc -c -Wconversionでwarningが消えません

    gcc version 2.96 20000731 (Red Hat Linux 7.0) でコンパイルオプション -c -Wconversionでwarningが消えません。 warning: passing arg 1 of `関数名' with different width due to prototype とwarningが出るのですが、プロトタイプ宣言の引数の型にちゃんとキャストして渡しているのですが…ちなみにプロトタイプ宣言の引数自体がint型とポインタだとwarningは出ません。-Wconversionとはいったい何者なのでしょうか? すべての関数の引数の型をint型とポインタに変更すればwarningは消せるのですが、なんか違う気がします。 かなり漠然的な質問で申し訳ありませんがどなたか知っていれば教えてください。宜しくお願い致します。

  • perlからsystemコマンド呼ばれる時のシェルについて

    HP-UX/perl4 で作成したスクリプトを、Linux(Red Hat)/perl5 へ移植するに当たって、system関数の動作が異なり困っています。 HP-UX では ksh をシェルとして使用していたため、perl からのsysytem関数で実行するsystemコマンドも、kshで動作するものを使っていました。Linuxでもログインシェルをkshに設定しました。 ところが、HP-UXで使っていたprintコマンドが使用できず、以下のエラーメッセージが出ます。 sh: print: command not found シェルはkshを指定していても、perlからsystem関数やバッククウォート`` でシステムコマンドを実行するときは、shが使われるようなのです。 perl内の記述は以下のとおりです。 system("print 'a'"); "print"の前に"ksh "をつけたり、"print"を"echo"に変えると、正しく動作します。 移植するperlの本数が多いのと、print以外にもこの問題が起きるかもしれませんので、できれば perl 内からのシステムコマンド実行時にもログインシェルとおなじ ksh で動くようにしたいのですが、どのようにすればよいのでしょうか? よろしくお願いいたします。

  • g++コンパイルしながら使用されたヘッダー・ライブラリのフルパスを表示させたい

    宜しくお願い足します。 : posix gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5) g++: no input files の環境です。 $ g++ -o hoge hoge.cc としてコンパイルしながらにコンパイラがどのヘッダー、ライブラリを使用したかフルパスで表示させるにはどのようなオプションを指定すればいいのでしょうか?

  • windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでた

    windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでたソースコードです。ファィル名test.c です。Linux(Red Hat9) gccです。windowsのコンパイラーはCPad for Borland C++Compilerです。 #include <stdio.h> void main() //intからvoidに変更した { int i, j; for (i=1; i<=9; i++){ printf("%2d ",i); //%2dで、iが2桁に表示 } printf("\n"); printf("***************************\n"); //この罫線もどきの書き方はダサいので工夫してください for (i = 1; i<=9; i++){ for (j = 1; j<= 9; j++) { printf("%2d ", i*j); if (j == 9) printf("\n"); //1行表示後改行 } } return; //voidにしたので0を取った! } これがLinux(RedHat9)gccでは以下のエラーが出ます。 (test.c: 関数 `main' 内: test.c:4: 警告: `main' の戻り値の型が `int' ではありません)  なぜ、同じソースコードでエラーが起こるのですか?  Linux gccでは、この場合`int' 以外の何が必要なのでしょうか? 以上よろしくお願いします。

  • printf()関数の括弧を二重にして、printf((~~~))とし

    printf()関数の括弧を二重にして、printf((~~~))として コンパイル/実行すると、実行時セグメンテーション違反が発生します。 コンパイル時には警告も発生しますが、このセグメンテーション違反が なぜ起こるのか理由がよくわかりません。ご回答いただけるとありがたいです。 以下、サンプルコードと実行例です。よろしくお願いいたします。 ---mytest.c---- 1 #include <stdio.h> 2 3 int main(void){ 4 5 //printf("test:%d", 1)ではもちろんコンパイル/実行に成功する。 6 printf(("test:%d", 1)); 7 return 0; 8 } 【コンパイル/実行結果/gccバージョン】 #gcc main.c main.c:6:警告:passing argument 1 of printf makes pointer from integer without a cast #./a.out セグメンテーション違反です # gcc --version gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) ・ ・

  • コンパイルできない...

    学校のC言語のレポートを家でやろうと思ったのですが、ソースコードを変更していないのにコンパイル時にエラーがでます。おそらく環境の違いによるものだと思うのですが、そのへんには非常に疎いもので教えていただけないでしょうか? 実行したコンパイルは gcc -g -o abc abc.c fft.o -lm です。 学校はRed Hat Linuxで自宅はWindowsなのでcygwinを用いています。エラー文ではfft.oがうまく取り込めていないみたいです。

  • C++プログラム実行時エラー

    お世話になります。 現在仕事でプログラムを書いていますが、 こんな事で困っています。 困っていること:コンパイルは通るのですが、実行時に下記のような現象が起きる。 [relocation error: /usr/lib/私の作ったSHARED_LIB.so.0: undefined symbol: __dso_handle] [__dso_handle]って何なのか良くわからない... 言語:C++ 特徴:STLを3つ使用している(vector,map,fstream) OS:RedHat9 その他:RedHat7.2及び7.3では起きないのですが、RedHat9で発生してしまう。 binutilsとgccとの関係も疑っているのですが... gcc version:3.2.2 20030222 (Red Hat Linux 3.2.2-5) ld version:2.13.90.0.18 20030206 御意見よろしくお願いいたします。

  • gccのオプション

    今晩は、Cの初心者です。 gccをコンパイラでつかっていますが、このgccをコマンドプロンプトから実行する場合にgccのオプションを見たいのですが、 どのようにコマンドを打つとオプションが見れるのでしょうか。

  • GCCのオプション

    GCCで組み込み用のソフトを作る時に、初期値付き変数の初期値をROMに変数をRAMに配置する為のオプションを教えてください。