在哪个库中写入 writev 和其他在 socket 上操作的函数,如 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
我喜欢运行这个命令在我的一些系统库或内核上寻找类似于sendfile、send、write writev 的函数名。命令
nm -D /usr/lib/libopenal.so.1 //or T option
但我不知道在哪里可以找到这些函数的确切名称,我的想法是 运行 上面的命令带有 grep 管道,所以我可以获得函数的确切名称,例如 sendfile,
有人告诉我然后写可能有名字 64__sys_write 这是正确的国王,也许它的一些其他功能所以我想知道我可以在 ubuntu linux 上获得这个信息
But I don't know where to look for these functions
你不需要知道去哪里找,但你应该学会如何自己找到琐碎问题(比如这个)的答案。
以下是您可以使用的步骤:
- Select 一个执行您感兴趣的功能的程序。在
send
的情况下,nc
和 telnet
似乎是不错的潜在候选人.
- 确认所选程序确实调用了
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
.
中定义的
我喜欢运行这个命令在我的一些系统库或内核上寻找类似于sendfile、send、write writev 的函数名。命令
nm -D /usr/lib/libopenal.so.1 //or T option
但我不知道在哪里可以找到这些函数的确切名称,我的想法是 运行 上面的命令带有 grep 管道,所以我可以获得函数的确切名称,例如 sendfile,
有人告诉我然后写可能有名字 64__sys_write 这是正确的国王,也许它的一些其他功能所以我想知道我可以在 ubuntu linux 上获得这个信息
But I don't know where to look for these functions
你不需要知道去哪里找,但你应该学会如何自己找到琐碎问题(比如这个)的答案。
以下是您可以使用的步骤:
- Select 一个执行您感兴趣的功能的程序。在
send
的情况下,nc
和telnet
似乎是不错的潜在候选人. - 确认所选程序确实调用了
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
.