我在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函数,或者我误解了什么?
非常感谢提前!
答案 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。