私はdotnetコアプロジェクトを作成しており、P / Invokeを使用していくつかのLinuxシステム機能を呼び出したいと思います。必要な機能を備えた.soファイルを見つける方法は?
例えば。 getpidを使用するには、次のインポートを追加する必要があります。
[DllImport("libc.so.6")]
ネットワークコネクタマニュアルページコネクタから受信したデータを解析するためだけにNLMSG_DATAを使用することをお勧めします。私はC#コードでこのメソッドを呼び出したいと思います。インポートするSOファイルを見つける方法は?
答え1
GNUシステムでどのダイナミックライブラリがどのシンボルをエクスポートしているかを確認するには、次の手順を試してください。
ldconfig -p |
sed -n 's/.* => //p' |
sort -u |
xargs -d '\n' nm --defined-only -oDg |
grep -w getpid
(最初の近似では、inodeレベルで重複項目を削除して改善できます。)
nm
フラグを調整し、検索するファイルのリストを収集する方法を調整する必要があるかもしれませんが、静的ライブラリ、ELF、またはその他のサポートされているオブジェクトを使用して同様の操作を実行できます。
ただし、この場合、NLMSG_DATA
すべての大文字はCプリプロセッサマクロである可能性が高いです。
$ grep -r NLMSG_DATA /usr/include
/usr/include/linux/netlink.h:#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
Cヘッダーファイルで定義を見つけるために、またはなどのいくつかのgrep
コードインデックスツールを使用して、全体 。ctags
cscope
gtags
/usr/include
Cプリプロセッサを使用して拡張することもできます。
printf '%s\n' '#include <linux/netlink.h>' 'please_describe[NLMSG_DATA(nlh)]' |
gcc -P -E -x c - | sed '/please_describe/,$!d'
please_describe[((void*)(((char*)nlh) + ((0) + ((int) ( ((sizeof(struct nlmsghdr))+4U -1) & ~(4U -1) )))))]
したがって、サイズに応じて入力ポインタから一定量のポインタオフセットを返しますstruct nlmsghdr
(Cコンパイラを使用するか、ポインタを使用しているオブジェクトのシンボルをデバッグして決定できますstruct
)。
ヘッダーはソフトウェアを実行するのに必要ではなく、ビルドするだけです。デフォルトでは、すべてのライブラリにヘッダーがインストールされていないため、ヘッダーをインポートするには一部またはxxx-dev
パッケージをインストールする必要があります。xxx-devel
ライブラリ関数のマニュアルページ(一部のカーネルAPIなので、ここには実際には適用されません)がある場合、ヘッダファイルもある可能性が高いです。マニュアルページでパッケージに移動し、ヘッダーとライブラリに移動できます。たとえば、Debian とattr_setf
この関数の派生物では、次のようになります。
$ man -w attr_setf
/usr/share/man/man3/attr_set.3.gz
$ dpkg -S /usr/share/man/man3/attr_set.3.gz
libattr1-dev:amd64: /usr/share/man/man3/attr_set.3.gz
$ dpkg -L libattr1-dev | grep /include/
/usr/include/attr
/usr/include/attr/attributes.h
/usr/include/attr/error_context.h
/usr/include/attr/libattr.h
/usr/include/attr/xattr.h
ライブラリの場合、パッケージを推測するか、パッケージがランタイムパッケージに依存するという事実を使用できますlibattr1
。-dev
$ apt-cache show libattr1-dev | grep Depends
Depends: libc6-dev | libc-dev, libattr1 (= 1:2.4.47-2build1)
$ dpkg -L libattr1 | grep /lib/
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/libattr.so.1.1.0
/lib/x86_64-linux-gnu/libattr.so.1
$ nm -Dg /lib/x86_64-linux-gnu/libattr.so.1 | grep attr_setf
00000000000016e0 T attr_setf
マニュアルページはありませんが、存在することがわかっている場合は、次に利用可能なパッケージを見つけることができます。
$ apt-file search -x 'man.*/attr_set\.\d'
libattr1-dev: /usr/share/man/man3/attr_set.3.gz
ncurses-doc: /usr/share/man/man3/attr_set.3ncurses.gz