2016-07-23 9 views
1

glibcをちょっと掘り下げて、いくつかの関数を混乱させたいと思っていました。 しかし私はここで何か間違っています。glibcで任意の関数を呼び出すことができない理由

# gcc -o test1 test1.c 
/tmp/ccKHkJ4L.o: In function `main': 
test1.c:(.text+0xa): undefined reference to `nscd_init' 
collect2: ld returned 1 exit status 

私の質問:nscd_init」 `へ未定義の参照コンパイル時に

int main(void) { 

    nscd_init(); 

    return 0; 
} 

リターン:

A非常に少ない例でnscd/connections.cで定義されてnscd_init()を呼び出すと呼び出しここでは:

私のプログラムでglibc関数を呼び出す方法はありますか、それとも間違って何か誤解していますか?

事前に感謝します。

答えて

0

glibcは、一般的な使用(つまり、ユーザアプリケーションでの使用)に使用するすべてのシンボルをエクスポートしません。これは、glibcの内部使用のためのプライベートシンボルで、nscdにのみ関連しています。あなたはそれを徹底的に調べてはいけません。とにかく、あまり面白い機能ではありません。

シンボルの可視性とその意味を詳しく知りたい場合は、this is a good starting point

+0

私はこの機能に興味があったわけではありませんでしたが、一般的には内部機能を呼び出すことはありませんでした。そのリンクをありがとう、確かにそれを読むでしょう! – segway

1

エリザベスの答えに追加します。

シンボルを.soで表示する場合は、nmを試してください。 -gスイッチは外部から利用可能なシンボルのみを表示し、-Dはダイナミックシンボルテーブルを参照します(デバッグの代わりにダイナミックリンクに使用されます)。 nscdの機能については

[email protected] ~/se $ nm -Dg /lib/x86_64-linux-gnu/libc.so.6 | head 
0000000000045960 T a64l 
0000000000036eb0 T abort 
00000000003c4be0 B __abort_msg 
000000000003a620 T abs 
00000000001077d0 W accept 
0000000000107fa0 T accept4 
00000000000f6a60 W access 
00000000000fce40 T acct 
00000000000fe120 W addmntent 
00000000000478e0 W addseverity 
.... 

:あなたはglibcの中でリンクすることができ、シンボルを表示するには

[email protected] ~/se $ nm -Dg /lib/x86_64-linux-gnu/libc.so.6 | grep nscd 
0000000000129670 T __nss_disable_nscd 

nscd_initは、リンクでは使用できません。

関連する問題