ABIってなに?

2012/03/04開発環境import

ABIとは

Application Binary Interfaceの略称です。
何のことかと云われると、高級言語(組み込みだと主にCになるでしょう)向けの、
データ配置ルールや関数引数と返値のレジスタ渡しルールを定めたモノです。
これが異なると、オブジェクトリンク時に適切に処理ができません。

object file提供のソフトを結合するケースや、ABIに併せてバイナリデータを
流し込んでくるようなインタフェースを設計した場合に、アタリが出ます。
全てのソースファイルを自分(自社)でbuildするソフト屋ならば、アタリは少ないでしょうが、
基本的に複数名での開発や、LinuxなどのOSを使う場合に動的リンクするライブラリのABIも
揃っていないと、実行時にシヌこととなるでしょう。

このあたり、エミュレータ作ってたり、開発環境の準備をするヒトなんかは
しっかりと把握しておかないとダメですね。昨今はCPUも種類が増えていますし、
バイナリレベルで下位互換を保ってはいても、拡張機能を使うライブラリと
リンクするときなども注意が必要です。

・・・恥ずかしながら、某Java Engineの結合の話が来るまで自分も知らなかったです。
昔は情報源が乏しかったのと、コンパイラなんて使うモノの挙動を見ればいいやと思っていたのですね。
しっかりと仕様書があるので、これを神様として、コンパイラの妥当性すらも
検証していくべきであると考えるようになりましたとさ。。。

ARM

ARM社のオンライン情報サイトが有用です。
コンパイラの参照資料として、以下があげられていました。後半にABIの付いたモノが、
今回ご紹介するものだと思います(未確認)
  • BSABI
  • BPABI
  • EHABI
  • CLIBABI
  • AADWARF
  • CPPABI
  • AAPCS
  • RTABI
  • AAELF
  • ABI Addenda


PowerPC

IBMやfreescale社が ABI仕様書を出しています。
ARMとは異なり、Instruction Setがアーキテクチャにより増減している模様。
今まさにはまっているところなので、後日まとめたいと思います。

[gcc][AVR] attributeによるバイト数装飾

2010/03/11開発環境::gccimport

変数のビットサイズ~gcc方言の巻

avr-gccのstdint.hを見る

VMにWinXP32bitを放り込んで、WinAVR 20100110をインスコ。uint32_tが8bitになっとる、という話をmixiのコミュで見かけたので検証してみました。とりあえずコードレベルで追いかけるとして、ヘッダファイルを探索。

typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__))); 

・・・・なんぞこれ。

__attribute__ってあたりは、まぁ、なんぞローカル定義の装飾しているなぁとは思うわけですが、__SI__ってなによ...


変数サイズ指定

Anton-sanがいいこといった! Single Integerだそうだ。

・・・ナニソレ?


* Title: Gcc help pages about __mode__ keyword
* From: Anton Soppelsa <soppelsa at igi dot cnr dot it>
* To: gcc at gnu dot org
* Date: Tue, 22 Nov 2005 15:48:45 +0100
* Subject: Gcc help pages about __mode__ keyword

Dear GCC help pages maintainers,
I recently encountered a statement like this one


__attribute__((__mode__(__DI__)))

in a micro kernel source file.

As I'm not so skilled with this kind of C/C++ syntax I tried to read the manual about the keywords involved in that expression.
Despite I found information about "__attribute__" and "__mode__"
I wasn't able to find information about "__DI__" (on the gcc manual pages).
Of course I found in Internet partial explanation of the meaning of "__DI__" keyword and also found out that there are many of the same type like "__SI__", "__HI__", and "__QI__".
 By the way, do they mean Double-, Single-, Half-, Quarter-, -Integer?

The point is that it seem to me those identifiers are actually keywords of the compiler.
So they really have be mentioned (at least) in the compiler manual. Better would be if they are explained.
I guess that part of the manual is not so well maintained because I found only reference to the keywords "__byte__" or "__word__" or "__pointer__".


This message is just to inform u about something if u have the time to work about has to be done (in my opinion) .
Best regards,

※本文にメールアドレスがありましたが、削除しています。改行も入れました..

__SI__の謎

George-sanないすだ!CIL (C Intermediate Language)ということで、Cコンパイル時の中間言語の領域に到達した。やはりこのあたりから学ばないと、コンパイラの理解は終わらないようだな…。


GCC allows you to use the __mode__ attribute to specify the size of the integer instead of the standard char, short and so on:

int __attribute__ ((__mode__ (  __QI__ ))) i8;
int __attribute__ ((__mode__ (  __HI__ ))) i16;
int __attribute__ ((__mode__ (  __SI__ ))) i32;
int __attribute__ ((__mode__ (  __DI__ ))) i64;

ちょっとわかりづらい。CLI特有というわけでもないぽいなぁ...


答えは身近に―

後閑師のところで、C30の説明があり、ここで紹介されてました。ナンテコッタイw

以下、引用

typedef int __attribute__((__mode__(SI))) int32 ; // int32を32ビット幅の整数型と定義

modeで指定したビット幅の型を定義する\byteは1バイト整数型、wordは1ワード整数、pointerはポインタ型を定義する\modeには下記記号が使用できる\QI : 8ビット(char)\HI : 16ビット(int)\SI : 32ビット(long)\DI : 64ビット(long long)\SF : 32ビット(float)\DF : 64ビット(long double)ちょっぴり、アンダースコアの量が違いますが、まぁ、もともとも思想は同じと思って良いでしょう。処理系依存が多いでしょうし、迷ったときはアセンブラコードをはかせてみる。sizeof()でバイト数をチェックする、といった習慣をつけたほうが良いですね。特にマイコン屋さんは。仕事でも趣味でも。ね。。

注意

斜め読みどころか、英語弱いのにかじりながら見た部分が多いですので、鵜呑みにせずリンク先の情報を消化して納得してください。\WEBの情報がすべて正しいとは限りませんし、何事も本家までさかのぼるよう習慣付けましょう…。頼むよほんと(ぉ