若槻

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 をビルドする手順を説明します。他のターゲットも同様の手順で可能と思われます。

続きを読む

2018年09月20日

タイトルが本記事の内容のほぼ全てです。自分で libgcc をビルドするという奇特(誤用)な人以外には関係無い話ですが(※)、まあこんなこともあるんだなと。

おそらく Linux (aarch64-linux-gnu) ターゲット等でも共通だと思うのですが、現象を確認したのはベアメタル (aarch64-elf) ターゲットで、GCC 5.1/6.3 です。7.2 では発生しませんでした。(4 系でも発生すると思いますが、そもそも AArch64 のサポートが 4.8 からなので、枯れてるとは言い難い 4 系の使用自体が現在では非推奨だと思います。)

続きを読む

2018年09月12日

ARM の AAPCS の仕様では、enum のサイズは可変長と固定長の 2 パターン許されています。

異なるバイナリをリンクすると当然、正常動作は期待できないため、これは重要な違いとなります。
続きを読む

2018年01月30日

glibc のテストスイートを確認していた所、string/test-string.h にて以下のようなシンボルが使われていたのですが、このシンボルの出所が全くわからなくてしばらく悩んだので、その正体をメモしておきます。
extern impl_t __start_impls[], __stop_impls[];
続きを読む

2017年12月18日

QEMU の Windows 版は、標準(エラー)出力が exe のあるフォルダ内の stdout.txt/stderr.txt というファイルに出力されてしまうので、コマンドラインから使う際には不便だと長年思っていましたが、これは SDL ライブラリのバージョン 1.2 の仕様だったようです。最近の QEMU はバージョン 2.0 に対応しているので、コンソールに出力されます。MSYS2 上でビルドする際などに、SDL 1.2 と 2.0 が両方インストールされていると 1.2 が優先されてしまう場合があるので、configure 時に --with-sdlabi=2.0 を指定しておくと確実です。

2017年12月11日

Windows 10 Fall Creators Update から WSL (Windows Subsystem for Linux) が使用できるようになり、Windows で Ubuntu 等の Linux バイナリが実行できるようになり、非常に便利です。
諸事情により、MSYS2 上から WSL 内の実行ファイルを実行したい場合に、MSYS2 はコマンドライン文字列中のファイルパスを勝手に変換してしまうため、正しく wsl コマンド経由で WSL 内部のファイルにアクセスすることができなくて悩んだので、その解決策のメモです。
続きを読む

2017年02月01日

手元にあった弊社製の古い評価ボード KZM-ARM11-01(※1) で、musl libc のテストスイートを、開発中のバージョンの exeGCC(※2) でコンパイルして動かしてみた所、最適化オプション Os だと一部テストが FAIL するが、O2 だと PASS するという現象が発生しました。それだけだとよく聞くような話ですが、分割コンパイルしていて、別ファイルのコードを変更すると、アセンブラソースもオブジェクトファイルも全く同じなのにリンクすると期待通り動かなくなるなど、奇妙な挙動にだいぶ悩まされました。

続きを読む

2016年11月21日

お久しぶりです。だいぶ間が空いてしまいました。その間、全身性エリテマトーデス(SLE)という、免疫が狂って自分自身を攻撃してしまう原因不明の難病を発病し、半年ほど休職していたりと色々ありましたが、なんとか職場復帰することができました。またよろしくお願いします。

そんなこんなで浦島太郎状態なのですが、QEMU のサイトを久しぶりに見てみた所、Docker という仮想化技術を使用して QEMU の Windows 用バイナリをビルドできるようになったそうなので、試してみました。
続きを読む

2016年02月18日

MSYS2 を試してみた所、LLVM/Clang が比較的簡単にビルドできましたので紹介します。以前紹介した、VisualStudio でビルドする場合と比較すると、
  1. LLVM/Clang のビルドに必要な、GCC、CMake、Python、GNU Make などの各種 GNU ツールが、Linux の APT や Yum のようなパッケージマネージャ(MSYS2 は Arch Linux の pacman を採用)でインストールできるので、環境構築や管理が楽。
  2. VisualStudio は比較的大きく、有償(無料の Express エディションもありますが、常用には登録が必要)のソフトウェアなので、比較的コンパクトで自由なソフトウェアである MSYS2 の方が色々楽。
  3. GNU 環境のコマンドライン操作に慣れている人には、MSYS2 の方が楽。
などの利点が考えられます。
続きを読む

2015年12月02日

Xilinx さんが公開している QEMUは Linux ホストのみサポートなのですが、一応ごにょごにょしてみたら Windows でも MinGW-w64 環境で動作させることができたので、メモを残しておきます。(ちゃんとした修正では無いことを、ご了承ください。)

続きを読む

2015年10月09日

GNU ld が ARM ターゲットのプログラムのリンク時に以下のような警告を出すケースに遭遇しました。(XXX.out は ELF ファイル名)
C:/PATH/TO/ld.exe: XXX.out: warning: sh_link not set for section `.ARM.exidx'
普通は出ない珍しい警告で、日本語ではほとんど情報が無くて調査に苦労したので、メモしておきます。
続きを読む

2015年10月06日

Design Solution Forum 2015 で、LLVM と GCC の違いや、弊社の(現在開発中の)ARM64 用 PARTNER デバッガのアセンブラ/逆アセンブラ表示に LLVM を使用した事例などを紹介(35 分)してきました。
続きを読む

2015年07月23日

過去に何回か似たような記事を書いてますが、それのアップデートです。

内容的には、以下とほとんど同じ内容です。このツールの組み合わせでビルドが成功したというメモです。

LLVM 3.5(git リポジトリ)をMS VC++でビルド (2014/3/6)

(2015/9/4 追記: 下記手順で Express 2015 for Windows Desktop と LLVM 3.7.0 でもビルドと動作を確認しました。リンク先、中央の Community 2015 ではなく、下の方の Express for Windows Desktop からダウンロードしてください。)

続きを読む

2015年07月15日

不具合原因の詳細や、根本的な対策まではわかっていませんが、とりあえず現象と回避策を整理がてら記しておきます。

- 現象

Ubuntu 14.04/15.04 64bit (x86_64)上で Windows で動作する sh-*-elf ターゲットのクロス gcc を、Ubuntu の MinGW ツールチェーンでカナディアンクロスビルドすると、その gcc で特定パターンをコンパイルした時に、コンパイラ内部エラー(ICE)が発生する不具合がある。

gcc 4.8.4/4.8.5/4.9.2/4.9.3 で確認。32bit (x86) exe でも 64bit (x64) exe でも同じ結果。4.9.x が特に起こりやすく、libgcc の fp-bit.c コンパイル時に ICE が発生する。(後述するが、再現コードも作成できた。)4.8.x でも locale-inst.cc に -O2 以上の最適化で発生する。これらは Linux 上でネイティブ動作する sh のクロス gcc では発生しない。ソースや依存ライブラリ、configure 時のオプション等は、host の設定以外は全て Windows 向けと同じ。(また、Ubuntu 14.04 と 15.04 ではネイティブ、MinGW 共に gcc のバージョンが異なるが、あまり関係無いようだ。)

- 現状の回避策

32bit の Ubuntu (i386)上でカナディアンクロスビルドする。

- 原因の予想

おそらく gcc のカナディアンクロスビルドシステムにバグがある。特に、64bit Linux のネイティブ gcc は long が 64bit なのだが、MinGW gcc は 32bit でも 64bit でも long が 32bit (LLP64 モデル)なので、(gcc が LP64 モデルの Linux 上で使われてきた歴史を考えても)そのようなマイナーなパターンの対策は不十分な可能性が高い。また、sh のバックエンドの sh.md ファイルの記述のしかたにも問題があると思われる。具体的には、Tbit 操作のために 0x80000000 という定数が必要なようなのだが、md ファイル内では 10 進符号付整数しか記述できないようで、(const_int -2147483648) という、32bit の INT_MAX(2147483647)を超える即値が記述されている ※1。さらにややこしいことに、md ファイルは、genrecog という gcc の内部ツールにより、insn-recog.c に変換されてビルドされるのだが、この genrecog はビルド途中でネイティブ gcc でビルドされて作られ、一方 insn-recog.c は MinGW gcc でビルドされるのだが、その際の long の長さの違いが考慮されていない可能性が高い。

※1 C コンパイラは、通常はトークン単位で処理を行うため、仮に - が付いていても、- と 2147483648 は独立して処理されるので、問題が起こることがある。そのため INT_MIN は、通常は (-INT_MAX-1) のように定義されることが多く、MinGW gcc の limits.h もそうなっている。

詳細は以下になります。
続きを読む

記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード