Open4

NCCCバインディングI/F仕様

okuokuokuoku

NCCC 仕様でバインディングされたライブラリが提供するNCCC呼出しの仕様。WASM用のものとは一旦完全に分離することにした。特に 番号が被っているがユーザ側で頑張って呼び分けることにする 。そのうちWASMライブラリの方をこちらに揃えたい。

https://zenn.dev/okuoku/scraps/2c18a3b4ce6350

okuokuokuoku

DLLインターフェース

NCCCコレクションは以下のシンボルをエクスポートする。

void <LIBNAME>_nccc_root_00(const uint64_t* in, uint64_t* out);

<LIBNAME> はコレクションのシンボル名でDLLファイル名となる。コレクションは複数のNCCCライブラリを格納でき、それらはインデックス番号で識別される。

okuokuokuoku

stub types

NCCCライブラリからエクスポートされるAPIはいずれかのstub typeを持つ。現在はforward_0のみ。

forward_0

非NCCC APIをNCCCプロトコルで呼出すためのスタブ。取得するアドレスは関数ポインタで、直接呼出しを行う。

rootシンボル <LIBNAME>_nccc_root_00 もforward_0スタブとして実装される。

forward_1

非NCCC APIをNCCCプロトコルで呼出すためのスタブ。取得するアドレスはディスパッチャとコンテキスト(ctx)の2つで、間接呼出しを行う。ディスパッチャはforward_0スタブであり2引数を取る。

[ctx param_addr] => out

forward_1スタブは動的に実行コードを生成できないプラットフォーム(iPhone等)でスクリプト言語からコールバックを提供する場合などに使用する。

forward_2

非NCCC APIをNCCCプロトコルで呼出すためのスタブ。予約。関数ポインタを特定の関数型でwrapするために使用する。

okuokuokuoku

コアライブラリ

コアライブラリはシンボルのlookupなどライブラリの動的リンクに使用する。一度lookupした結果はコレクションのビルドIDが一致する場合はキャッシュして良い。

エラーコード

エラーとなる可能性のあるAPIはエラーコードを返却する。今のところエラーコードの意味は特に設定していない。エラーが無い場合はエラーコードとしてゼロを返却する。

any => [res ret ...]

エラーコードは必ず先頭に返却される。呼出しがエラーになった場合は以降を解釈すべきではない。特に、可変長レスポンスに対するバッファサイズ不足エラーは存在しない(十分なサイズのバッファを確保するのは呼出し側の責任となる)。

0:0 collection_info

[0 0 version] => [buildid32_L buildid32_H libcount maxversion]

versionは 1 でなければならない。ライブラリのビルドIDを返却する。

1:LIB:1 library_info

[1 lib 1] => [nameptr0 nameptr1 maxexport maximport maxvariables maxstubs]

ライブラリの情報を取得する。 nameptr0 nameptr1 はライブラリ名のASCIIZポインタとなる。

(FIXME: variablesは定数も含む)

1:LIB:2 library_export_info

[1 lib 2 exportid] => [res objid32 nameptr stubtype addr0 addr1 incount outcount]

★ このリクエストはキャッシュできない ★

(ASLRによってアドレスはロード毎に変化する可能性があるため)

library_import_info

library_variable_info

library_stub_info

1:LIB:6 library_arg_info

[1 lib 6 objid] => [res incount outcount intype ... outtype ...]