4

私は (linux) gcc 4.8.2 でコンパイルされた小さな静的ライブラリを -fvisibility=hidden で共有ライブラリにリンクしています (C コードの gcc と Fortran コードの ifort の 2 つのバージョンがあります)。スタティック ライブラリは、いくつかの内部関数で構成されており、すべて "ST_LIB_" という接頭辞が付いています。

静的ライブラリで宣言された関数が、共有ライブラリにリンクされている実行可能ファイル/ライブラリで使用できないことを確認したいと思います。Linux で、プレフィックスを持つ関数が外部ライブラリで使用できないことを確認するための最適なコマンドは何ですか?

私が試してみました:

nm --dynamic shared_lib | grep -i "ST_LIB_" | wc -l(出力 0)

readelf -d shared_lib | grep -i "ST_LIB_" | wc -l(出力 0)

nm -g shared_lib | grep -i "ST_LIB_" | wc -l(共有ライブラリに応じて 26 または 0 を出力)

readelf -s shared_lib | grep -i "ST_LIB_" | wc -l(共有ライブラリに応じて 26 または 0 を出力)

readelf -Ws shared_lib | grep -i "ST_LIB_" | grep -i "HIDDEN" | wc -l(共有ライブラリに応じて 26 または 0 を出力)

4

1 に答える 1

2

nm --dynamic(共有ライブラリから) リンクできるシンボルが表示されるため、探しているオプションである必要があります。readelf --dyn-syms同じ情報を表示する必要があります (異なる出力)。

を使用する場合は、属性nmを持つシンボルを確認してください。"T"マニュアルページから:

The symbol type.  At least the following types are used; others are, as well, depending 
on the object file format.  If lowercase, the symbol is usually local; if uppercase, the
symbol is global (external).  There are however a few lowercase symbols that are shown
for special global symbols ("u", "v" and "w").
[...]
"T"
"t" The symbol is in the text (code) section.

100% 確実にしたい場合は、共有ライブラリにリンクしてST_LIB_シンボルの 1 つを使用しようとするテスト プログラムをいつでも作成できます。

于 2014-03-14T09:57:33.483 に答える