请让我知道什么是 _nocancel() 系统调用(例如 __pwrite_nocancel()),以及是否有办法创建 LD_PRELOAD 库来拦截这些调用。以下是一些背景信息:
我正在研究 Oracle 数据库的功能,并希望使用 LD_PRELOAD 添加一个小的填充层来捕获有关用户空间中的调用的信息。我知道使用系统水龙头捕获此信息的其他方法,但使用 LD_PRELOAD 是客户的硬性要求。strace 显示该特定进程正在重复调用 pwrite();类似地,pstack 堆栈跟踪显示 __pwrite_nocancel() 正在作为堆栈上的最后一个条目被调用。我尝试复制我自己的 __libc_pwrite() 函数,并声明,
extern ssize_t pwrite(int fd, const void *buf, size_t numBytes, off_t offset)__attribute__((weak, alias ( "__libc_pwrite")));
但是当我链接库并运行 nm -a |grep pwrite 时,我得到以下结果:
000000000006c190 T __libc_pwrite
000000000006c190 W pwrite
Run Code Online (Sandbox Code Playgroud)
相反, nm -a /lib64/libpthread.so.0 |grep pwrite 给出以下内容:
000000000000eaf0 t __libc_pwrite
000000000000eaf0 t __libc_pwrite64
000000000000eaf0 W pwrite
000000000000eaf0 t __pwrite
000000000000eaf0 W pwrite64
000000000000eaf0 W __pwrite64
0000000000000000 a pwrite64.c
000000000000eaf9 t __pwrite_nocancel
Run Code Online (Sandbox Code Playgroud)
我注意到 _nocancel 版本仅比 …