サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
CES 2025
blog.kmckk.com
2019年09月13日 GCCの最適化による予期せぬ無限ループの発生 コンパクトな独自の libc を実装していて、GCC のテストを通したところ、WARNING: program timed out. が原因による FAIL が多発しました。調べた結果、非常に意外な結果だったのでメモします。 問題は、calloc の実装でした。以下のように、全く問題無さそうな簡単なコードです。 #include <stdlib.h> #include <string.h> void *calloc(size_t n, size_t size) { size_t bytes = n * size; void *p = malloc(bytes); if (p) { memset(p, 0, bytes); } return p; } これが、GCC 6.4.0 の arm-eabi で O2 でコンパイル
2018年11月08日 GCC5以降のlibstdc++のデフォルトABI変更について GCC 5 以降の C++ ライブラリ、libstdc++ はデフォルトの ABI が変更されているため、それ以前の g++ でコンパイルしたバイナリとは(デフォルトでは)リンク互換性がありません。ただし、旧 ABI もサポートしているので、Dual ABI サポートのライブラリとなっています。 これについてまとまった日本語情報が見当たらなかったのでまとめてみます。 確認環境には、GCC 7 と GCC 4.8 が簡単に共存できるので、Ubutun 18.04 を使用します。apt-get で g++ と g++-4.8 をインストールしてあるものとします。 $ cat /etc/os-release NAME="Ubuntu" VERSION="18.04.1 LTS (Bionic Beaver)"
2017年02月01日 GCC(ARM)のunaligned data accessコード生成 手元にあった弊社製の古い評価ボード KZM-ARM11-01(※1) で、musl libc のテストスイートを、開発中のバージョンの exeGCC(※2) でコンパイルして動かしてみた所、最適化オプション Os だと一部テストが FAIL するが、O2 だと PASS するという現象が発生しました。それだけだとよく聞くような話ですが、分割コンパイルしていて、別ファイルのコードを変更すると、アセンブラソースもオブジェクトファイルも全く同じなのにリンクすると期待通り動かなくなるなど、奇妙な挙動にだいぶ悩まされました。 ※1 既にディスコンなので、この URL はそのうち消えるかもしれません。 ※2 サイトの exeGCC に関する記述がだいぶ古くてすみません。昨年全面リニューアルの予定だったのです
2016年11月21日 Windows用QEMUをDockerコンテナを使用してUbuntu Linuxでクロスビルド お久しぶりです。だいぶ間が空いてしまいました。その間、全身性エリテマトーデス(SLE)という、免疫が狂って自分自身を攻撃してしまう原因不明の難病を発病し、半年ほど休職していたりと色々ありましたが、なんとか職場復帰することができました。またよろしくお願いします。 そんなこんなで浦島太郎状態なのですが、QEMU のサイトを久しぶりに見てみた所、Docker という仮想化技術を使用して QEMU の Windows 用バイナリをビルドできるようになったそうなので、試してみました。 Docker は Linux ホスト上で、別の仮想 Linux ユーザー空間(環境)を軽量高速に動作させることができる技術です。QEMU の開発グループが準備した、Windows 用バイナリのビルド環
2016年02月18日 LLVM/Clang 3.7.1をMSYS2でビルド MSYS2 を試してみた所、LLVM/Clang が比較的簡単にビルドできましたので紹介します。以前紹介した、VisualStudio でビルドする場合と比較すると、 LLVM/Clang のビルドに必要な、GCC、CMake、Python、GNU Make などの各種 GNU ツールが、Linux の APT や Yum のようなパッケージマネージャ(MSYS2 は Arch Linux の pacman を採用)でインストールできるので、環境構築や管理が楽。 VisualStudio は比較的大きく、有償(無料の Express エディションもありますが、常用には登録が必要)のソフトウェアなので、比較的コンパクトで自由なソフトウェアである MSYS2 の方が色々楽。 GNU 環境のコマンドライン操作に慣れてい
2015年02月24日 Linux上でビルドしたGCCクロスコンパイラを(簡易)テストする方法 PC Linux ホスト上で、sh の評価ボードなどホストと異なる環境をターゲットにした、GCC のクロスコンパイラ ※ をビルドするのは比較的簡単で、ウェブ上にも情報はたくさんあるのですが、それをテストする方法がなかなかわからず苦労しました。その時のメモです。 ※ この記事では newlib を使用した bare-metal target、いわゆる OS レスの環境をターゲットにしたクロスコンパイラの、ソフトウェア CPU シミュレータを使用した簡易テスト方法を扱います。GCC のビルド環境や、dejagnu などの(通常のネイティブ GCC の)テスト環境は、既に整っているものとします。 このサイトが非常に参考になりました。 参考サイト: MIPS Cross Compiler build
2014年11月17日 Xilinx Linux for Zynq AP SoCをUbuntu 14.04でビルドする ソースレベルデバッグのためにデバッグ情報付きのバイナリ(vmlinux)が必要になったため、Xilinx Linux for Zynq AP SoC をソースからビルドした時のメモです。 基本的には Xilinx 社の公式 Wiki の記述通りに進めれば良いのですが、Ubuntu Linux のバージョンが異なったため、いくつかそのままでは上手く行かない所がありました。 http://www.wiki.xilinx.com/Build+kernel 使用した環境は、Windows 7 64bit 上に、VMWare Workstation を使用して作成した Ubuntu Linux 14.04 64bit 環境です。 以下のサイトから iso ファイルをダウンロードして
2014年09月18日 #include_nextの疑問メモ 前回の記事で、GNU CPP の独自拡張 #include_next 指令を紹介しました。 「GNU CPP(GCC)の独自拡張#include_next指令」 このドキュメントは簡単な概要と例だけなので、ちょっと複雑なケースになると、この挙動は仕様なのか?バグなのか?という判断が難しくなります。 この間、私が悩んだ疑問は、過去に以下の ML で取り上げられた疑問とほぼ同じものでした。 gcc-help ML: #include_next: wrong search order? この疑問を単純化して解説した後、私なりの解釈を説明します。 まず、GNU CPP は、#include や #include_next 指令を見つけると、gcc-include-dir(GCC 独自のインクルードファイルが含まれるディレクトリ)、sys
2014年09月11日 GNU CPP(GCC)の独自拡張#include_next指令 Warp の挙動を調べている時に、GCC のプリプロセッサの #include_next 指令の挙動にかなり悩んだので、備忘録も兼ねてドキュメントの日本語訳をアップロードします。 厳密な仕様が無く、あまり有名でもない(?)独自拡張なので(ARM CC や IBM XL C/C++ など、一応 GCC 以外のコンパイラのプリプロセッサにも取り入れられているようですが)、情報が少なく、実際にいろいろ動かして実験してみないと挙動がよくわからず、かなり混乱しました。以下の翻訳もあまり自信が無いので、何かお気づきの点があれば、コメント欄にてご指摘いただけると幸いです。(ただし、現在スパムコメントがあまりにも多いため、半角英数字のみのコメント、国外の IP アドレスからのコメント、改行が 10 個以上あるコメント
2014年09月05日 環境変数でLinuxのglibc動的リンカにログを出力させる たまには役に立ちそうなネタも書かないとということで、この間社内で話題※になった、glibc 環境の Linux の動的リンカに共有ライブラリのデバッグ時に有益な情報を出力させる方法を紹介します。 ※ この Tips は、弊社の PARTNER-AP(JTAG-ICE デバッガではなく、Linux アプリをデバッグするためのアプリデバッガ)案件で役に立った実績のある Tips なので、glibc と共有ライブラリを使用するような、比較的リッチな Linux 環境において有効です。(デバッガとは無関係で、純粋に Linux 環境でのデバッグ機能の紹介となります。) Linux のアプリが大規模になってくると、非常に大量の共有ライブラリを動的ロードすることとなり、実際にどの共有ライブラリがどんな風にロードされて
2014年01月23日 GCCのトランザクションメモリサポート GCC のリリースノートを眺めていたら、4.7 からトランザクションメモリのサポートが入っていたことに気付いたので、少し調べてみました。 ・トランザクションメモリとは? トランザクションメモリは、マルチスレッドプログラムにおいて、複数のスレッドからアクセスされる共有変数(メモリ)を保護するためのしくみのようです。 共有変数の保護には、従来は mutex などのロックが使用されてきました。しかし、ロックを使用したプログラム片(関数など)は、ロックの取得と解放の順番が重要なので、基本的には入れ子にできないという問題があります。常にプログラム全体に散らばるロックを意識する必要があるので、プログラムの部品化や再利用が困難になりますし、デッドロックのデバッグや品質保証は非常に高コストになりがちです。 一方トランザクションメモリは、原理的
2013年07月17日 GCC のプラグインを作ってみる (2) C++ で g++ のプラグインを書いてみる GCC はバージョン 4.8 から、実装言語が C++ になりました。というわけで、プラグインも今後は C++ で書きたいところです。また、せっかくなので、gcc ではなく g++ のプラグインを C++ で書いてみました。 参考サイト:Parsing C++ with GCC plugins, Part 2 とりあえず、g++ -4.7 をインストールします。 $ sudo apt-get install g++-4.7 以下のような g++ のプラグインを書いてみました。PLUGIN_OVERRIDE_GATE だと、何回もコールバックが呼び出されてしまうので、PLUGIN_FINISH_UNIT でコンパイル単位(cpp ファイル)が終わった時だけ、global names
2013年06月27日 ARMのNEONのSIMD命令をgccのオートベクタライズの最適化で使う方法 以前にgccでNEONのSIMD命令を生成させる方法という記事を書きましたが、今はかなり状況が変わっています。コンパイラのオートベクタライズの最適化はずっと進化していて、簡単なコンパイルオプションをつけるだけでNEONのSIMD命令を活用することができるようになっています。 Ubuntu 12.04LTSのarm-linux-gnueabihf-gccを使用しています。 $ arm-linux-gnueabihf-gcc -v Using built-in specs. COLLECT_GCC=arm-linux-gnueabihf-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper Target
2013年06月26日 GCC でコンパイルした時のオプションをバイナリファイルから取得する GCC 4.7 のリリースノートに、新しく追加された -grecord-gcc-switches オプションを付けると、DWARF デバッグ情報の DW_AT_producer 属性文字列にコンパイラのコマンドライン文字列が追加されるよ、と書いてあることに気付いたので、さっそく試してみました。 試した環境は Ubuntu 12.04 64bit です。 gcc のバージョンを確認してみたところ、4.6.3 だったので、まずは 4.6 の出力を確認してみます。コンパイルする C ファイルは何でも良いのですが、ここでは test.c というファイルをコンパイルしています。 $ cat test.c int f() { return 0; } $ gcc -O2 -c -g test.c $ reade
2013年06月11日 速度を犠牲にせずにクラッシュ直前のログを採取するシンプルで効果的な方法 先日6月7日に開催されたテクニカルジャンボリーに出席し、その前に行われたLinuxCon Japanでの発表資料を使って日本語で話をしてきました。 トラブルシューティングの時にはprintfなどでログを出すことがありますが、あまりにたくさんログを出すと動作が遅くなって支障がでて、少しでも速くしようとメモリにバッファリングするとクラッシュしたときに肝心のログの最後の部分が欠けてしまいます。「高速」かつ「最後のログ」が取れる簡単な方法をみつけたので紹介します。 Simple and efficient way to get the last log using MMAP from Tetsuyuki Kobayashi 「Linux」カテゴリの最新記事 タグ : embedded linux
2013年03月12日 自分でデバッグ用のmallocライブラリを作ったときにはまった落とし穴 先日3月8日に開催されたテクニカルジャンボリーでmallocの話をしてきました。Embedded Linux Conference 2013では英語で発表したのですが、ここでは気楽に日本語で話しました。 Tips of Malloc & Free from Tetsuyuki Kobayashi 「Linux」カテゴリの最新記事 タグ : celfjp linux embedded malloc
2013年03月07日 U-Bootのデバッグ 先日のKMCセミナーでU-Bootの話をしました。その中から一部をピックアップして紹介します。 U-Bootのブートシーケンス まずは古典的でシンプルなブートシーケンスです。電源投入するとCPUはNORフラッシュ上のU-Bootを実行します。U-BootはDRAMなど必要なハードウェアの初期化を行った後に、なんらかの方法でLinuxカーネルをDRAM上にロードし、制御を移します。Linuxカーネルをロードする元としては、NORフラッシュや、NANDフラッシュ、SDカード、あるいはtftp等のプロトコルでネットワーク経由でロードしたりします。 U-Bootのデバッグを行うには、まずはこの方法で試すのがよいでしょう。KZM-A9-GTボードにはこれが可能なようにNORフラッシュメモリを搭載しています。 最近のブートシーケンスはもっと複雑になってい
2012年04月11日 arm-linux-gnueabihf-gcc (Hard Float)の生成コードを見てみる Ubuntu 12.04LTSでのarm-linux-gnueabihf-gccのツールチェインのhfはHard Floatの意味です。 関数呼び出し規約(Calling Convention)が変更されて、double, floatの引数はFPUのレジスタに積んで渡し、戻り値もFPUのレジスタを使うようになっています。今までは、FPUが利用可能だったとしても、Soft Floatと互換性を保つために汎用レジスタで引き渡していました。当然これらは混ぜて使うことはできません。全てのライブラリに影響があります。 簡単なプログラムで実際に生成されるコードを見てみます。 Ubuntu 12.04LTS Beta2を使用しています。 ツールチェインのインストール $ sudo ap
2013年02月08日 Makefileの依存関係の記述を自動化する簡単な方法 ビルドにmakeコマンドを使うときにはMakefileにファイルの依存関係を書いておく必要があります。 しかし、開発の途中でインクルードするヘッダファイルが増えてくると、これらの依存関係を手作業で記述するのは面倒です。(そして、これをサボったことでハマることもよくあることです。:) ここでは、gccの機能を使ってこれを自動化する方法を紹介します。 gccのプリプロセッサで依存関係を自動生成する gccでコンパイルするときに -MD というオプションをつけると、コンパイルとともに拡張子が.dのファイルが作成されます。これはMakefileと同じ書式でそのファイルの依存関係が記述されています。 詳しくはgccのマニュアルを参照してください。 http://gcc.gnu.org/onlinedocs/gcc-4.7
2013年01月08日 QCOW2 形式の仮想ディスクを作成する QEMU のイメージファイル(仮想ディスクとして使用)を配布する際には、実際に使ったぶんだけファイルサイズが大きくなる(あるいは、別ファイルに差分だけを書き出せる)、QCOW2 形式(QEMU Copy-On-Write image file format version 2)が便利です。 buildroot でビルドした rootfs.tar から、QCOW2 形式のイメージファイルを作った時のメモです。 環境は Ubuntu 12.04 64bit です。 追記:kpartx は不要でした。 qemu-img、qemu-nbd、kpartx をインストールして、nbd (Network Block Device) を準備します。 $ sudo apt-get install qemu-utils kpartx $ sud
2012年12月12日 組み込みエンジニアのためのLinux入門 仮想メモリ編 2012年12月7日に行われたテクニカルジャンボリーでLinuxの仮想メモリについて話をしてきました。 ここにそのスライドとビデオを貼っておきます。 Basic of virtual memory of Linux from Tetsuyuki Kobayashi 「Linux」カテゴリの最新記事 タグ : celfjp linux embedded
2012年12月05日 QEMUでARM Ubuntuを動作させる Linaro が公開している ARM Ubuntu を QEMU で動作させる方法を解説します。 ホスト環境は、Windows7 64bit です。(基本的には Linux 環境でも同じはずです。) ターゲット環境は、QEMU の ARM Versatile Express 評価ボードです。 QEMU は、以前解説した環境でビルドした、32bit Windows 版を使用しました。バージョンは 1.1.2 です。 ※ pragma で coroutine-win32.c の最適化をオフにしてビルドしました。現在 QEMU ON WINDOWS のサイトでは、MinGW gcc-4.7.2-1 を使用しているようなので、gcc をアップデートすれば、このハックは不要になるかもしれません。(未確認) ARM Ubuntu の構
2012年10月23日 開発用のrootfsで起動後すぐにシリアルコンソールでrootで自動ログインする方法 開発ボードでカーネルをいじるときには、rootfsとしてLinaroのサイトにあるnanoやALIPを私はよく使用します。 これらの便利なところは、起動するとすぐにシリアルコンソールにrootで自動ログインしてshellのプロンプトが出るところです。しかも、rootfsの中では、明示的にシリアルコンソールのデバイス名を指定しなくても自動で判別してくれています。 これがどのような仕組みになっているのかを少し調べました。そのメモを残します。 いままで (その1) 昔のSystemV方式のinitでは、どのデバイスでgettyを動かすかは、 /etc/inittab に記述していました。 /dev/console でgettyを通さずに直接/bin/shを起動するには、そのように書くこと
2012年09月27日 初めてのパッチ投稿(体験談) 2012年9月20日に行われたテクニカルジャンボリーでパッチ投稿について話をしてきました。 ここにそのスライドとビデオを貼っておきます。 Patch101 from Tetsuyuki Kobayashi メイルソフト"Thunderbird" というべきところで間違って"Firefox"と言ってしまっているところが多々ありました。 参考情報 git send-email で エイリアスを使う パッチを投稿するときのgitコマンド Debian でgit-emailでGmail経由でメール送信する方法 「Linux」カテゴリの最新記事 タグ : celfjp linux embedded patch
2012年07月10日 Android 4.1.1のソースを取得してemulatorをビルドする 本日Android 4.1.1 (Jelly Bean)のソースコードが公開されたので、それをとってきてemulatorのビルドをしてみました。 0. 前準備 あらかじめmasterのリポジトリでrepo syncしておきます。これはJBのソース公開の前にやっておきます。 $ cd android-master $ repo sync さて、JBのソースが公開されたときに全部をとってくるのはネットワーク資源の無駄。 masterのディレクトリにある .repo を再利用します。 $ cd .. $ mkdir android-4.1 $ cp -a android-master/.repo/ android-4.1/ 1. ソースコードの取得 これで以下のように repo initからrepo
2012年06月25日 Ubuntu 12.04でtftpサーバをセットアップする Ubuntu 12.04でtftpサーバをセットアップする手順を紹介します。 U-bootはnfsでuImageをロードすることもできるのですが、tftpのほうがnfsよりも早くロードが完了します。そのため開発時の毎回の起動時間を考えるとtftpサーバを立ててuImageはtftpでロードするほうが作業効率が上がります。 インストール $ sudo apt-get install tftp tftpd xinetdのセットアップ tftpdは以前はinetdで管理されていましたが、今はxinetdで管理されます。 $ sudo vi /etc/xinetd.d/tftp /etc/xinetd.d/tftp の内容は以下。 service tftp { protocol = udp port = 69 so
2012年06月20日 QEMU 1.1.0 で MIPS Debian GNU/Linux を動作させてみる Android と言えば ARM ですが、最近は MIPS ベースの Android にも注目が集まっているようです。 (私はあまり詳しくないのですが。) そういえば、x86 と ARM 以外の Linux は動作させたことが無いなと思ったので、まずは QEMU 1.1.0 で MIPS Linux を動作させてみることにしました。 QEMU のビルドは、前回の記事の configure オプションに、mips-softmmu と mipsel-softmmu を追加する以外は同じです。(大してビルド時間は変わらないので、ARM もまとめて作っています。不具合回避のために、coroutine-win32.c だけ -O0 でコンパイルする必要があるのも同じです。) ./confi
2012年05月15日 Ubuntu 12.04LTS 正式版でMultiarchを試す 前回、「Ubuntu 12.04LTS Beta2でMultiarchを試す」の続き。 前回は正式リリース直前のUbuntu 12.04 Beta2でMultiarchを試しました。ユーザーモードQEMUを使うことで、armhf用の実行オブジェクトをそのまま実行できるようになっています。 実は、Beta2から正式版の間にarmhfのインタフェースに関して大きな動きがありました。ダイナミックリンカのパス名が各ディストリビューションごとにまちまちでした。armhfのディストリビューションをまたがったバイナリ互換を目指すならば、ダイナミックリンカのパス名の統一は必要条件です。 メーリングリスト上で議論を行うもののなかなか収束せずに、最後は電話会議によって決定されたようです。 https://wiki.lin
2012年04月19日 PARTNER-JetでU-bootを追いかける(4) U-bootの起動シーケンスを見てみます。 なお、今回の記事はKZM-A9-Dualボードで使用した2009年のU-bootに基づいています。最近のリリースのU-bootではファイル構成もリロケーションのしくみもかなり変っていました。これについては後日とりあげます。 NORフラッシュからのブート KZM-A9-DualボードではSDカードやeMMCからも起動することができますが、今回は一番シンプルなNORフラッシュに焼いてあるU-Bootの起動手順を見てみます。おおまかには以下の通りです。 電源投入してリセット解除 CPUは0番地のNORフラッシュから実行開始 DRAMコントローラなど基本的なハードウェアの初期化 NORフラッシュ内のU-bootのコードをDRAM上にコピー DRAM上のコードにジャンプ U-B
次のページ
このページを最初にブックマークしてみませんか?
『KMC Staff Blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く