为什么我不能在glibc中调用任意函数

时间:2016-07-23 16:29:41

标签: c glibc

我在glibc附近戳了一下,想要弄乱它的一些功能。 但是我在这里做错了。

调用nscd / connections.c中定义的调用nscd_init()的一个非常小的示例:

int main(void) {

   nscd_init();

   return 0;
}

在编译期间返回对“nscd_init”的未定义引用:

# 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

我的问题在这里:

有没有办法在程序中调用glibc函数,或者我误解了什么?

非常感谢提前!

2 个答案:

答案 0 :(得分:1)

加入伊丽莎白的回答。

如果要列出.so中的符号,请尝试使用nm。 -g开关仅打印外部可用的符号,而-D查看动态符号表(用于动态链接而不是用于调试)。要查看可以在glibc中链接的符号:

evaitl@bb ~/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
....

至于nscd函数:

evaitl@bb ~/se $ nm -Dg /lib/x86_64-linux-gnu/libc.so.6   | grep nscd
0000000000129670 T __nss_disable_nscd

nscd_init无法进行关联。

答案 1 :(得分:0)

glibc不会导出它用于公共用途的每个符号(即用于用户应用程序)。这恰好是glibc内部使用的私有符号,仅与nscd相关,你不应该用它来探索,而且无论如何都不是一个非常有趣的函数。

如果您想了解有关符号可见性及其含义的更多信息,请this is a good starting point