在哪个库中编写 writev 和其他在套接字上操作的函数,如 send 以及 .so 文件的位置在哪里

Posted

技术标签:

【中文标题】在哪个库中编写 writev 和其他在套接字上操作的函数,如 send 以及 .so 文件的位置在哪里【英文标题】:In which library write writev and other functions that operate on socket like send also and where is the location of .so file 【发布时间】:2022-01-20 20:02:47 【问题描述】:

我喜欢在我的一些系统库或内核上运行此命令来查找类似于 sendfile、send、write write 的函数名称。命令

nm -D /usr/lib/libopenal.so.1 //or T option

但是我不知道在哪里可以找到这些函数的确切名称我的想法是我只是用 grep 管道运行上面的命令,这样我就可以得到函数的确切名称,例如 sendfile,

有人告诉我然后写可能有名字 64__sys_write 这是正确之王,也许它的一些其他功能所以我想知道我可以在 ubuntu linux 上获得这些信息

【问题讨论】:

ldd (Ubuntu GLIBC 2.33-0ubuntu5) 2.33 内核版本 5.14.1 它们都在 libc 中,无论现在 Ubuntu 把它放在哪里 【参考方案1】:

但是我不知道去哪里找这些功能

你不需要知道去哪里看,但你应该学会如何自己找出琐碎问题(比如这个)的答案。

您可以使用以下步骤:

    选择一个锻炼您感兴趣的功能的程序。sendnctelnet 似乎是很好的潜在候选人。 验证所选程序确实调用了send
nm -AD $(which nc telnet) | grep ' send'
/usr/bin/nc:                 U sendmsg@GLIBC_2.2.5
/usr/bin/telnet:                 U send@GLIBC_2.2.5

好的,假设我们只对send 感兴趣,那么telnet 是我们的“目标”而nc 不是。

    找出telnet 使用哪些库:
ldd /usr/bin/telnet
        linux-vdso.so.1 (0x00007ffe957d4000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2f2e2f4000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2f2e12f000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2f2dfea000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2f2e53c000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2f2dfd0000)

函数send 必须在其中之一中定义。哪一个?

    在每一个上运行nm -D | grep ' send',发现函数在libc.so.6中定义:
nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep ' send'
00000000000fee60 W send@@GLIBC_2.2.5
00000000000f3430 T sendfile@@GLIBC_2.2.5
00000000000f3430 W sendfile64@@GLIBC_2.3
00000000000ff520 W sendmmsg@@GLIBC_2.14
00000000000fef20 W sendmsg@@GLIBC_2.2.5
00000000000fefc0 W sendto@@GLIBC_2.2.5

奖励:您发现sendfile libc.so.6 中定义。

【讨论】:

以上是关于在哪个库中编写 writev 和其他在套接字上操作的函数,如 send 以及 .so 文件的位置在哪里的主要内容,如果未能解决你的问题,请参考以下文章

readv 和 writev

客户端中的套接字编程

如何决定在套接字通信中使用哪个端口

如果套接字握手中的客户端证书中有两个有效证书,则在 SSL 连接中使用哪个证书

TCP之非阻塞connect和accept

readv函数和writev函数