2019年09月13日

コンパクトな独自の libc を実装していて、GCC のテストを通したところ、WARNING: program timed out. が原因による FAIL が多発しました。調べた結果、非常に意外な結果だったのでメモします。

続きを読む

2019年04月22日

とある開発中のプロジェクトで、GCC/Clang のインラインアセンブラが意図しない不正コードを生成し、バグではないか?と調査しました。

その結果、これはどうやら正しい仕様らしい、しかし非常に間違いやすく混乱しやすいケースだと思ったのでメモしておきます。

解決策だけを先に言いますと、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でも動作させることができたのでメモしておきます。

続きを読む

2019年01月18日

前回の記事では、Xilinx QEMU の Zynq UltraScale+ MPSoC ZCU102(ZynqMP)ターゲットの APU(AArch64 Cortex-A53 4 コア)上で Toppers fmp を動かしました。

今回は RPU(ARM Cortex-R5 2 コア)上で Toppers fmp を動かして見ます。
環境は前回の準備を前提としますが、今度は ARM のツールチェーンの準備が別途必要です。

続きを読む

2018年12月27日

以前の記事で Xilinx QEMU を Ubuntu 18.04 上でビルドしましたが、その QEMU を使って、Zynq UltraScale+ MPSoC(以後 ZynqMP) の APU パート、AArch64 (a53) 4 コアターゲットの Toppers FMP を動かして見ました。

Toppers も、QEMU と同じ Ubuntu Linux 環境でクロスビルドします。
何か所かハマったので、正解ルートだけではなく、あえてハマったポイントと回避策も記録として残しますので、少々冗長になります。

続きを読む

2018年12月14日

GNU ld には wrap という機能があります。これはリンク時に、未定義(Undefined)のシンボル foo を __wrap_foo として解決し、元のシンボルを __real_foo として解決するという機能です。これを利用すると、バイナリ提供のライブラリ関数を差し替えることが可能になります。

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 をクロスビルドする方法を解説します。

続きを読む

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年02月15日

Depending on the PC environment, "Application hang while the debugger startup", "LoadError" or "Rebase Error" may occur. To avoid this problem, add "-rebase ADDRESS" to the start option of PARTNER in the following steps.
  1. Start PARTNER-Jet2 Configuration (JetSet)
  2. Select a target project and move to "Startup options" tab.
  3. Add "-rebase" option to the text box on the bottom right in the Startup Options tab.
[Example]
-B01000000,32 -rebase 0x40000000
The recommended value of the address to be specified for "-rebase" option is different depending on the Windows version and type of the PARTNER Application (32-bit or 64-bit). The following table shows recommended values in the different environments.
PARTNERWin7Win8/Win10
32-bit version0x40000000 0x40000000
64-bit version0x070000000000x70000000000


2018年02月15日

使用するPCの環境によっては、『PARTNERの起動の途中でロック』したり 『LoadError』 や 『Rebase Error』 が発生する場合があります。 この現象を回避するためには、次の手順でPARTNERの起動オプションに "-rebase アドレス" を追加します。
  1. PARTNER-Jet2 環境設定を起動します。
  2. プロジェクトを選択して、[起動オプション設定]タブを開きます。
  3. [起動オプション設定]タブ内の右下のテキストボックスに -rebase オプションを追加します。
[例]
 -B01000000,32 -rebase 0x40000000
-rebase に指定するアドレスの推奨値はPARTNERの32bit版/64bit版のEXE種別とWindowsのバージョンにより以下の様になります。
PARTNERWin7Win8/Win10
32bit版EXE0x40000000 0x40000000
64bit版EXE 0x070000000000x70000000000


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 を指定しておくと確実です。

記事検索
最新コメント
「最新トラックバック」は提供を終了しました。
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード