若槻
2020年11月19日
追記:本記事の内容は C++98 から有効であるとコメント欄にて教えていただきました。情報提供に感謝いたします。
GCC でコンパイル時に -Wall -Wextra の 2 オプションを付けるというのは非常に一般的です。この場合、以下のように未使用の関数引数には警告が出ます。
続きを読む
GCC でコンパイル時に -Wall -Wextra の 2 オプションを付けるというのは非常に一般的です。この場合、以下のように未使用の関数引数には警告が出ます。
$ cat test.c void f(int x) {} void g(int x) {} int main() { f(10); g(10); return 0; } $ gcc -Wall -Wextra test.c test.c: In function ‘f’: test.c:1:12: warning: unused parameter ‘x’ [-Wunused-parameter] void f(int x) {} ^ test.c: In function ‘g’: test.c:2:12: warning: unused parameter ‘x’ [-Wunused-parameter] void g(int x) {} ^しかし、例えばコールバックとして渡す関数(ハンドラ)のように、引数を全部使わない関数というのはよくあります。
続きを読む
2020年11月17日
以前、「GCCの最適化による予期せぬ無限ループの発生」という記事を書きました。この時は -fno-builtin-malloc や __asm __volatile("":::"memory"); などで対策できました。
しかし今回、現状最新の GCC 10 で、memset、しかもナイーブな *(char *)s++ = (char)c; みたいな実装ではなく、NetBSD の本格的な実装のもので発生し、-fno-builtin や -fno-builtin-memset、-ffreestanding などでも抑制できず、-fno-tree-loop-distribute-patterns というあまり一般的ではないオプションが必要になりました。
これは一見 GCC のオプションが効いてない、バグのように思えますが、調べて見ると GCC の仕様に根差した問題であることがわかりました。
続きを読む
しかし今回、現状最新の GCC 10 で、memset、しかもナイーブな *(char *)s++ = (char)c; みたいな実装ではなく、NetBSD の本格的な実装のもので発生し、-fno-builtin や -fno-builtin-memset、-ffreestanding などでも抑制できず、-fno-tree-loop-distribute-patterns というあまり一般的ではないオプションが必要になりました。
これは一見 GCC のオプションが効いてない、バグのように思えますが、調べて見ると GCC の仕様に根差した問題であることがわかりました。
続きを読む
2020年08月26日
GNU ld(リンカ)には、EXCLUDE_FILE というフィルタ機能があり、特定のファイル(*.o オブジェクトファイルだけではなく、ライブラリの *.a アーカイブファイルも)を入力ファイルのワイルドカード指定から除外することができます。
この構文には単一セクションの場合は問題ありませんが、複数セクションを指定する場合に非直感的な仕様があることがわかったので紹介します。
続きを読む
この構文には単一セクションの場合は問題ありませんが、複数セクションを指定する場合に非直感的な仕様があることがわかったので紹介します。
続きを読む
2020年04月15日
RISC-V のベクトル拡張は現在策定中の仕様です。最新安定板はバージョン 0.8 で、一つ前は 0.7.1 でした。そのためインターネット上には古い情報と新しい情報が混在しています。
この記事もすぐに古くなると思いますが、開発版の 0.9.x ベースの GCC ツールチェーンの動作確認ができたので、シェルスクリプト化して公開します。
続きを読む
この記事もすぐに古くなると思いますが、開発版の 0.9.x ベースの GCC ツールチェーンの動作確認ができたので、シェルスクリプト化して公開します。
続きを読む
2019年09月13日
コンパクトな独自の libc を実装していて、GCC のテストを通したところ、WARNING: program timed out. が原因による FAIL が多発しました。調べた結果、非常に意外な結果だったのでメモします。
続きを読む
続きを読む
2019年04月22日
とある開発中のプロジェクトで、GCC/Clang のインラインアセンブラが意図しない不正コードを生成し、バグではないか?と調査しました。
その結果、これはどうやら正しい仕様らしい、しかし非常に間違いやすく混乱しやすいケースだと思ったのでメモしておきます。
解決策だけを先に言いますと、GCC/Clang のインラインアセンブラを、可能ならば常に 1 文に 1 命令のスタイルで記述するようにすれば、この類の混乱は避けられそうです。
続きを読む
その結果、これはどうやら正しい仕様らしい、しかし非常に間違いやすく混乱しやすいケースだと思ったのでメモしておきます。
解決策だけを先に言いますと、GCC/Clang のインラインアセンブラを、可能ならば常に 1 文に 1 命令のスタイルで記述するようにすれば、この類の混乱は避けられそうです。
続きを読む
2019年04月18日
Xilinx 社の ZynqMP 詳しくないのですが、Xilinx QEMU は PMU※1(qemu-system-microblazeel)ターゲットの QEMU と APU/RPU※2(qemu-system-aarch64)ターゲットの QEMU を別プロセスで 2 つ起動してエミュレーションを行う構成が存在します。
以前ビルドした Windows 版※3でも動作させることができたのでメモしておきます。
続きを読む
以前ビルドした Windows 版※3でも動作させることができたのでメモしておきます。
続きを読む
2019年01月18日
2018年12月27日
2018年12月14日
GNU ld には wrap という機能があります。これはリンク時に、未定義(Undefined)のシンボル foo を __wrap_foo として解決し、元のシンボルを __real_foo として解決するという機能です。これを利用すると、バイナリ提供のライブラリ関数を差し替えることが可能になります。
C での使用例はネット上にたくさん存在しますが、C++ の例がほとんど見つからなかったのでメモしておきます。
続きを読む
C での使用例はネット上にたくさん存在しますが、C++ の例がほとんど見つからなかったのでメモしておきます。
続きを読む
2018年12月04日
QEMU の Windows 版のビルド方法は、このブログでも何度も取り上げていますが、QEMU が要求する GLib ライブラリのバージョンが上がり続けているなどの理由により、正常動作する QEMU をビルドできる環境を構築し、QEMU のバージョンアップに追従し続けることが、現状かなり難しくなっています。(少なくとも現在の MSYS2 の GCC 8.2.0 環境でビルドした QEMU は正常動作しません。)
そこで本記事では、QEMU のメンテナの一人であり、長年 Windows 版を開発、バイナリの配布をし続けている Stefan Weil さんがメンテナンスしているビルド環境をお借りして、Ubuntu 18.04 上で Windows 64-bit 版 QEMU をクロスビルドする方法を解説します。
続きを読む
そこで本記事では、QEMU のメンテナの一人であり、長年 Windows 版を開発、バイナリの配布をし続けている Stefan Weil さんがメンテナンスしているビルド環境をお借りして、Ubuntu 18.04 上で Windows 64-bit 版 QEMU をクロスビルドする方法を解説します。
続きを読む
2018年11月08日
GCC 5 以降の C++ ライブラリ、libstdc++ はデフォルトの ABI が変更されているため、それ以前の g++ でコンパイルしたバイナリとは(デフォルトでは)リンク互換性がありません。ただし、旧 ABI もサポートしているので、Dual ABI サポートのライブラリとなっています。
これについてまとまった日本語情報が見当たらなかったのでまとめてみます。
続きを読む
これについてまとまった日本語情報が見当たらなかったのでまとめてみます。
続きを読む
2018年11月07日
LLVM/Clang/compiler-rt は 3 つがセットになって初めて動作します。LLVM/Clang はマルチアーキテクチャ(例:ARM/AArch64/X86)、マルチターゲット(例:arm-eabi、arm-linux-gnueabi、arm-linux-gnueabihf、aarch64-elf、aarch64-linux-gnu)のコード生成が可能なのですが、ライブラリの compiler-rt だけは、3 つを 1 度にビルドしようとした場合に、1 ターゲットぶんしかビルドできないという問題があります。
そこでこの記事では、先に Ubuntu Linux 上で AArch64 ターゲットのクロス LLVM/Clang コンパイラをビルドした後、それを使用して AArch64 Linux ターゲットの compiler-rt をビルドする手順を説明します。他のターゲットも同様の手順で可能と思われます。
続きを読む
そこでこの記事では、先に Ubuntu Linux 上で AArch64 ターゲットのクロス LLVM/Clang コンパイラをビルドした後、それを使用して AArch64 Linux ターゲットの compiler-rt をビルドする手順を説明します。他のターゲットも同様の手順で可能と思われます。
続きを読む
2018年09月20日
タイトルが本記事の内容のほぼ全てです。自分で libgcc をビルドするという奇特(誤用)な人以外には関係無い話ですが(※)、まあこんなこともあるんだなと。
おそらく Linux (aarch64-linux-gnu) ターゲット等でも共通だと思うのですが、現象を確認したのはベアメタル (aarch64-elf) ターゲットで、GCC 5.1/6.3 です。7.2 では発生しませんでした。(4 系でも発生すると思いますが、そもそも AArch64 のサポートが 4.8 からなので、枯れてるとは言い難い 4 系の使用自体が現在では非推奨だと思います。)
続きを読む
おそらく Linux (aarch64-linux-gnu) ターゲット等でも共通だと思うのですが、現象を確認したのはベアメタル (aarch64-elf) ターゲットで、GCC 5.1/6.3 です。7.2 では発生しませんでした。(4 系でも発生すると思いますが、そもそも AArch64 のサポートが 4.8 からなので、枯れてるとは言い難い 4 系の使用自体が現在では非推奨だと思います。)
続きを読む