タグ

gccに関するcrafのブックマーク (61)

  • C言語から0番地へアクセスする方法についての個人的まとめ - /var/log/hikalium

    発端はuchan_nos氏によるこのツイートでした。 C言語で、当にメモリの0番地にデータを書きたいときはどうすりゃええの?— うー@技術書典8 Day1う31 BitNOS (@uchan_nos) 2020年2月12日 それに対する私のリプライ: uint8_t *p = 1; p--; *p = v;— hikalium (@hikalium) 2020年2月12日 私はこれで話が終わると思っていたのだが、どうやらそうではなかったらしく、色々な視点からの意見が加わりながら、話は混沌を極めたのでした…。 ということで、ここに私のこのツイートに対しての見解とか、わかったことをまとめておこうと思います。 私のリプライの背景について uchanさんが求める「0番地にデータを書きたい」という課題設定を、私はこのように解釈しました。 C言語において、整数0をポインタに変換すると、それはNULL

    C言語から0番地へアクセスする方法についての個人的まとめ - /var/log/hikalium
    craf
    craf 2020/02/16
  • In C, is it possible to change exported function name to different one?

    craf
    craf 2018/09/12
  • マニュアルにないgccのコマンドラインオプションの調べ方 - 組み込みの人。

    gccのコマンドラインオプションを調べる時にはいままではWEB上のマニュアルを見ていました。 http://gcc.gnu.org/onlinedocs/ 特に、ちょっとオプションのスペルを確認したい時などはコマンドラインオプションのサマリーのページでブラウザのページ内検索の機能で探していました。 でもここに書いてないオプションもあったりします。 例えば、ソースコードのcharsetを指定するオプションを探したのですがマニュアルに見当たりません。そのためにgcc体のソースコードを検索したりしたのですが、もっと簡単な方法を見つけました。 $gcc -v --help これでgccとgccから呼びだされるcc1, cc1plus, as, ldなどのコマンドラインオプションの簡単な説明が出力されます。 大量にでる(1000行以上)ので一度ファイルに落してエディタなどでみるといいでしょう。 $

    マニュアルにないgccのコマンドラインオプションの調べ方 - 組み込みの人。
    craf
    craf 2018/01/07
  • 64735 – std::future broken on armel

  • Linux共有ライブラリの簡単なまとめ - wagavulin's blog

    Linuxで共有ライブラリ(*.so)を作るようになったのでちょっと勉強してみた。今までは使うだけだったので、以下のようなことは知っていた。 作るときはgccの-sharedオプションを使う。 使うときはgccの"-lライブラリ名"でリンクするライブラリを指定する。 リンク時のライブラリ探索パスは-Lオプションで指定する。 実行時のライブラリ探索パスは/etc/ld.so.confに書いてあるディレクトリ。環境変数LD_LIBRARY_PATHでも指定可能。 ライブラリを作るときは、.cから.oを作るときに-fPICをつけるといいらしい。 新しくライブラリを入れたときはldconfigするといいらしい。 逆に今まであまり知らなかったこと。 ほとんどのライブラリはlibhoge.so, libhoge.so.1, libhoge.so.1.1のように3つくらいのファイルがあり、libhoge

    Linux共有ライブラリの簡単なまとめ - wagavulin's blog
    craf
    craf 2015/11/08
  • 便利かもしれないGCC builtin - にゃははー

    これは恐らくC++ Advent Calendar 2014の15日目です。 古来[要出典]より人々はいかに例外を投げた奴をトレースするかに命をかけてきた[要出典]。 投げられた例外自体や、そのメッセージを確認することはできるが、一体誰がその例外を投げたかという情報は一切乗らないからだ。 いっそのことsegfaultでもしてくれたほうがデバッガでスタックトレースを出力できる。 ある人は考えるだろう。 template <typename Base> struct exception_info : Base { explicit exception_info(const Base &base, const char *file, int line) : Base(base), file(file), line(line) {} virtual ~exception_info() noexce

    便利かもしれないGCC builtin - にゃははー
    craf
    craf 2014/12/24
  • static link について - 兼雑記

    案外、 static link ってわかってないもんです。というかリンカってわかってないもんです。そして案外はまるものです。以下のクイズに答えられるでしょうか。 クイズ1 $ nm main.o # int main() {} 0000000000000000 T main $ nm foo.a # void foo() { bar(); } void baz() {} foo.o: U bar 0000000000000010 T baz 0000000000000000 T foo $ nm bar.a # void bar() {} void baz() {} bar.o: 0000000000000000 T bar 0000000000000006 T baz $ gcc main.o foo.a bar.a最後のコマンドで、何が起きますか? 普通にリンクできる undefine

    static link について - 兼雑記
    craf
    craf 2014/10/04
  • なんでGCCはa*a*a*a*a*a を (a*a*a)*(a*a*a) に最適化できないの?っと

    c - Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)? - Stack Overflow 俺は科学技術計算の数値計算の最適化をしてたんだけどさ。GCCはpow(a, 2)をa*aにしてくれるんだな。うん。で、pow(a, 6)は最適化されずに、ライブラリ関数であるpowを呼んじゃうんだ。パフォーマンス的に最悪。(Intel C++ Compilerはpow(a,6)のライブラリ関数呼び出しを消し去ってくれるんだけどな) どうもよくわからんのが、pow(a, 6)をa*a*a*a*a*aで置き換えて、GCC 4.5.1をオプション"-O3 -lm -funroll-loops -msse4"で使ったら、mulsd命令を5個使う。 movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd

  • (翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの! - yohhoyの日記

    元記事:Understanding C/C++ Strict Aliasing, or - Why won't the #$@##@^% compiler let me do what I need to do!, Patrick Horgan氏 訳出メモ: 自分自身の理解のために日語訳を行ったStrict Aliasing Rules解説記事。 訳文中では "aliasing/alias", "strict aliasing rules", "type punning" をそのまま表記する。直訳すれば "別名(エイリアシング)", "厳密な別名規則", "型もじり(言い換え)" となる。 ところで、何が問題なの? strict aliasing rulesに関しては多くの混乱が見られます。人々を混乱させる主要因となっているのは、aliasingに言及する2種類の異なるグループ; コンパ

    (翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの! - yohhoyの日記
    craf
    craf 2014/03/12
  • 革命の日々! a.out からコンパイラバージョンを取得する方法

    忘れないうちにメモ Linuxで普通に実行ファイルつくると.commentセクションとデバッグインフォメーションの 二箇所にコンパイラのバージョンが入ってる。これはobjdumpやreadelfで観測できる。 なぜこんなテクニックを知る必要があるかというとバグ報告で嘘のコンパイラバージョンを 報告してくる輩はけしてレアではないからである 1つめ。.comment セクションを objdumpで表示 % objdump -s -j .comment a.out a.out: file format elf64-x86-64 Contents of section .comment: 0000 4743433a 2028474e 55292034 2e342e36 GCC: (GNU) 4.4.6 0010 20323031 32303330 35202852 65642048 2012030

    革命の日々! a.out からコンパイラバージョンを取得する方法
    craf
    craf 2013/11/29
  • なぜGCCのCプリプロセッサーはlinuxという名前のマクロ名を定義するのか

    Why does the C preprocessor interpret the word "linux" as the constant "1"? - Stack Overflow Why does the C preprocessor interpret the word “linux” as the constant “1”? | Hacker News 以下のCコードをコンパイルしようとするとエラーになる。 $ cat test.c #include <stdio.h> int main(void) { int linux = 5; return 0; } $ gcc test.c test.c: In function ‘main’: test.c:4:9: error: expected identifier or ‘(’ before numeric constant なぜ

    craf
    craf 2013/10/10
  • Why does the C preprocessor interpret the word "linux" as the constant "1"?

    Why does the C preprocessor in GCC interpret the word linux (small letters) as the constant 1? test.c: #include <stdio.h> int main(void) { int linux = 5; return 0; } Result of $ gcc -E test.c (stop after the preprocessing stage): .... int main(void) { int 1 = 5; return 0; } Which of course yields an error. (BTW: There is no #define linux in the stdio.h file.)

    Why does the C preprocessor interpret the word "linux" as the constant "1"?
    craf
    craf 2013/10/10
  • GCCの組込みアトミック命令の使い方 | Everyday Deadlock

    ちょっと使うことがあったので、備忘録的にGCCの組込みアトミック命令の使い方についてまとめておきます。 前提知識 マルチスレッドプログラムにおいて、共有データを更新する際の定石は spin lock や mutex でデータを保護することです。 これらの道具は多くの場面において十分便利なのですが、例えば共有データが1個の int 変数のみであり、更に高頻度で更新が行われるといった場合にはやや同期のコストが高くついてしまいます。 そのような場合には、アトミック命令を用いることで同期オーバーヘッドを抑えることができます。 アトミック命令とは、複数のスレッドから実行されても、個々の命令が一つ一つ順番に適用されてゆくことが保証されている命令のことです。 (より正確には、個々の命令がとある順番で一つ一つ適用された時と同じ結果を得られることが保証されている命令のことです) 例えば、とある変数 X の値

    craf
    craf 2013/08/09
  • 革命の日々! 専用builtin はコンパイル時ワーニングを出すのに必須じゃないよ。という話

    前回、strcpy()は __builtin_strcpy_chk() を使っていて。。という話を書いたので、コンパイラが専用にサポートしている関数しかコンパイル時ワーニングを出せないと理解されてしまう恐れがあると思いここで、補足しておく 以下のgist をみるとわかるように大抵のコンパイル時処理は自前でできる。今のところコンパイル時にstrlen()をする方法が思いつかないので __builtin_strcpy_chk()は無理かもしれないが。 https://gist.github.com/kosaki/5515798 ポイントは char* my_memcpy_warn () __attribute__ ((alias("my_memcpy_chk"))); attribute((alias))を使うと、my_memcpy_warnをmy_memcpy_chkのエイリアスとして登録で

    craf
    craf 2013/05/12
  • 革命の日々! __attribute__(alloc_size) を使わないと_FORTIFY_SOURCE を活かせないよ。という話

    _FORTIFY_SOURCEというバッファーオーバーフロー攻撃を防ぐのにとても有用なマクロがある。 知らなかった人は以下のmanでもまず見てください http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/feature_test_macros.7.html _FORTIFY_SOURCE (glibc 2.3.4 以降) このマクロを定義すると、文字列やメモリの操作を行う様々な関数を 使用する際にバッファオーバーフローを検出するための軽めのチェックが 実行されるようになる。すべてのバッファオーバーフローが検出される わけではなく、あくまでよくある例についてだけである。 現在の実装では、以下の関数にチェックが追加されている: memcpy(3), mempcpy(3), memmove(3), memset(3), stpcpy(3),

    craf
    craf 2013/05/12
  • 第34回 C++とGCCの-fvisibilityオプション | gihyo.jp

    WindowsMac OS Xのように、1つの企業が開発環境や標準ライブラリを管理して、必要とあれば全ての開発者に新しいツールやライブラリを強制できる商用OSに比べて、世界中に分散した開発者がボランティアとして開発に参加しているOSSの世界では、新しいツールやライブラリが広く利用されるには過去との互換性を保つことが重要になります。 そのため、GCCやGlibc、X Window Systemといった主要なソフトウェアでは、過去のバージョンを用いていたソフトウェアも動作するように、バージョンアップを繰り返して中身がそっくり変わってしまっても、APIやABIは過去のバージョンとの(後方)互換性を保つように努力しています。 そのおかげで、最近では、OSの基盤となるこれらソフトウェアを更新する際も、以前のように互換性についてあれこれ調査する必要が無くなりました。その一方で、README等のファイ

    第34回 C++とGCCの-fvisibilityオプション | gihyo.jp
    craf
    craf 2012/05/31
  • GCCエクスプローラー

    C++11の参考書、アマゾンお気に入りリストを公開中。 アマゾンの江添のほしい物リスト C++11の参考書、C++の文法と機能をGitHubで公開中。詳しくは、の虫: C++11参考書の公開:C++11の文法と機能を参照 GitHub: EzoeRyou/cpp-book レポジトリのzipダウンロード GitHub Pageで閲覧:C++11の文法と機能 江添亮 自由ソフトウェア主義者 C++ Evangelist C++標準化委員会の委員 ドワンゴ社員 C++11を執筆した。 株式会社ドワンゴで働いている。 Mail:boostcpp@gmail.com Twitter:@EzoeRyou GitHub: https://github.com/EzoeRyou 江添亮のマストドン@EzoeRyou 筆者にブログのネタを提供するために、品物をアマゾンお気に入りリスト経由で送りたい場合

    craf
    craf 2012/05/29
  • GCCの警告を部分的にオフにする方法 - Boost Your Programming!

    来ならGCCの警告を出ないようにするのは良いことではないですが、どうしても警告を消すことができない場合はあると思います。 自分の例では、同じコードをgccとg++の両方でコンパイルすることがあるため、C++スタイルのキャストを使うことができずに警告が大量に出たりします。 そこで、ファイル単位や関数単位など、自分の好きな範囲で任意の警告をオフにする(またはオンにする)方法を記しておきます。 参考にしたページはこちらです。 オフにする場合には任意の場所で次のプラグマを追加します。 #pragma GCC diagnostic ignored "-Wcast-qual" オンにする場合も同様に次のプラグマを追加します。 #pragma GCC diagnostic warning "-Wcast-qual" ちなみに今書いてるC++のプログラムではオプションで以下のような警告を利用しています。

    GCCの警告を部分的にオフにする方法 - Boost Your Programming!
    craf
    craf 2012/03/07
  • 可変長マクロ引数の話 - デ-mk6

    これはC++11 Advent Calendar 2011の4日目の記事です。 C++11ではプリプロセッサが可変長マクロ引数に対応しました。例を挙げましょう。 #define ROTATE(...) ROTATE_I(__VA_ARGS__) #define ROTATE_I(x, ...) __VA_ARGS__, x ROTATE(1, 2) // 2, 1 ROTATE(ROTATE(1, 2, 3)) // 3, 1, 2というように、関数形式のマクロで任意個の引数を取ることができるようになる機能です。 それではこの新機能について詳しく見ていきましょう。 (なお、ここではプリプロセッサの話しかしないので、今後はいちいち「関数形式のマクロ」と言わず単に「関数」と言うことにします。また同様に、「識別子」と言えば「プリプロセス時の識別子」のことです。) まずは関数の定義です。 #def

    可変長マクロ引数の話 - デ-mk6
  • Boost.Build @ Linux + GCC + GNU Linker - Cry's Blog

    Boost.Build において,各ターゲットの種類に対してビルドプロパティの値が具体的にどのようなコマンドラインオプションに対応するかを, Linux + GCC + GNU Linker の環境において例示するという,私以外の誰も得をしないしそもそも他に理解できる人が居るのかすら怪しい表.(基コマンド)に各ビルドプロパティに対応するオプションが付加されたものが実際に走るコマンドになる. featurevalueobj (C++ ソースの場合)obj (C ソースの場合)lib (built shared) *1lib (built static) *2lib (prebuilt shared) *3lib (prebuilt static) *4exerun (基コマンド) "g++" -c -o "target" "source""g++" -x c -c -o "target"

    Boost.Build @ Linux + GCC + GNU Linker - Cry's Blog