Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何找出使用LD_PRELOAD截取哪些函数?_Linux_Elf_Ld Preload - Fatal编程技术网

Linux 如何找出使用LD_PRELOAD截取哪些函数?

Linux 如何找出使用LD_PRELOAD截取哪些函数?,linux,elf,ld-preload,Linux,Elf,Ld Preload,我正在尝试使用LD_PRELOAD机制拦截所有使用库comm.so调用syscallopenat的动态加载函数 考虑以下使用/sbin/depmod命令: #strace -f /sbin/depmod 3.10.0-693.17.1.el7.x86_64 (……) 我想截取调用此openatsyscall的函数 如何找出这个函数是什么openat(可能是别名)和任何其他类似的函数都不起作用-不会截获任何内容 我尝试使用此命令查找我的命令正在使用的动态加载函数: #readelf -p .dy

我正在尝试使用
LD_PRELOAD
机制拦截所有使用库
comm.so
调用syscall
openat
的动态加载函数

考虑以下使用
/sbin/depmod
命令:

#strace -f /sbin/depmod 3.10.0-693.17.1.el7.x86_64
(……)

我想截取调用此
openat
syscall的函数

如何找出这个函数是什么
openat
(可能是别名)和任何其他类似的函数都不起作用-不会截获任何内容

我尝试使用此命令查找我的命令正在使用的动态加载函数:

#readelf -p .dynstr /sbin/depmod 
这会打印出一些
.so
库,所以我递归地使用了
readelf
。在递归结束时,我有以下函数列表,其中包含
open
At

openat
openat64
open_by_handle_at
__openat64_2
这些都不起作用-它们不会拦截返回文件描述符3的调用

好的,那么如何找出我需要截取的其他函数呢?我是否必须遍历
readelf
命令所显示的所有函数,并且递归地一个接一个地(它们很多)?

可以调用
openat
系统调用(或任何其他调用,请参阅列表),而无需使用标准库中的
openat
函数;它可以从(处理ldu预加载)调用。在我的Debian/Sid系统上,动态链接器
/lib/ld linux.so.2
正在使用
openat
系统调用(例如尝试
strace/bin/true
),当然它使用自己的
open
openat
函数(而不是
libc.so

任何系统调用(原则上)都可以通过直接的机器代码(例如一些适当的
SYSENTER
machine指令)调用,或者通过一些间接的(在这两种情况下都不会使用
openat
C函数)调用。有关更多信息和规范,请参见

如果您想截取所有这些数据(包括那些由
ld linux
完成的数据,这很奇怪),您需要以类似的方式与
PTRACE\u SYSCALL
一起使用。此时,您将能够获取程序计数器和调用堆栈

如果您关注以下文件和文件描述符,请考虑设备。

如果您使用
gdb
(在没有DWARF调试信息的程序上使用它会很痛苦),您可以(在
gdb
中使用
ptrace ptrace_SYSCALL
的方法)找出(可能是“中断”)每个原始系统调用

顺便说一句,可能有些人正在通过
openat
系统调用(或在其他地方使用
openat
实现其
open
C功能)。通过研究特定
libc的源代码进行检查。因此
(可能是GNU)。

可以调用
openat
系统调用(或任何其他调用,请参阅列表),而无需使用标准库中的
openat
函数;它可以从(处理ldu预加载
)调用。在我的Debian/Sid系统上,动态链接器
/lib/ld linux.so.2
正在使用
openat
系统调用(例如尝试
strace/bin/true
),当然它使用自己的
open
openat
函数(而不是
libc.so

任何系统调用(原则上)都可以通过直接的机器代码(例如一些适当的
SYSENTER
machine指令)调用,或者通过一些间接的(在这两种情况下都不会使用
openat
C函数)调用。有关更多信息和规范,请参见

如果您想截取所有这些数据(包括那些由
ld linux
完成的数据,这很奇怪),您需要以类似的方式与
PTRACE\u SYSCALL
一起使用。此时,您将能够获取程序计数器和调用堆栈

如果您关注以下文件和文件描述符,请考虑设备。

如果您使用
gdb
(在没有DWARF调试信息的程序上使用它会很痛苦),您可以(在
gdb
中使用
ptrace ptrace_SYSCALL
的方法)找出(可能是“中断”)每个原始系统调用


顺便说一句,可能有些人正在通过
openat
系统调用(或在其他地方使用
openat
实现其
open
C功能)。通过研究特定
libc的源代码进行检查。因此
(可能是GNU)。

好的,那么在这个特定的示例中,我如何发现这个
openat
系统调用是如何进行的
ptrace
strace
不会告诉我是谁做的,只是告诉我它是谁做的。你可以使用其他
ptrace
调用来查询程序计数器、堆栈指针等,我检查了
syscall
没有这样做,我就像我说的那样,我检查了所有
openat
变体。你是说,这必然意味着,它一定是由机器指令完成的吗?根据定义,每个系统调用都是由一些机器指令触发的,比如
SYSENTER
INT
,等等。甚至在
perf
profilingtools下还有一个测试OK,那么在这个特定的示例中,我该如何发现,这是如何进行的
openat
syscall
ptrace
strace
不会告诉我是谁做的,只是告诉我它是谁做的。你可以使用其他
ptrace
调用来查询程序计数器、堆栈指针等,我检查了
syscall
没有这样做,我就像我说的那样,我检查了所有
openat
变体。你是说,这必然意味着它一定是由机器指令完成的吗?根据定义,每个系统调用都是由一些机器指令触发的,比如
SYSENTER
INT
,等等。甚至在
perf
profiling工具下也有一个测试。你为什么要
openat
openat64
open_by_handle_at
__openat64_2