fstat()在预加载的mmap()系统调用中无法按预期工作
fstat() does not work as expected inside a preloaded mmap() system call
我正在尝试从fstat()
获取设备的次要和主要编号。对fstat()
的调用在预加载的mmap()
系统调用中完成:
// preload.so
// compile with:
// gcc -ldl -Wall -shared -fPIC -o preload.so -D_GNU_SOURCE preload.c
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <dlfcn.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#if __GNUC__ >= 4
#define PUBLIC __attribute__ ((visibility("default")))
#else
#define PUBLIC
#endif
PUBLIC void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) {
printf("preloadn");
struct stat sb;
if (fstat(fd, &sb) == -1)
printf("fstat() failedn");
else
printf("%u %un", major(sb.st_rdev), minor(sb.st_rdev));
typedef void*(*mmap_t)(void *, size_t, int, int, int, off_t);
mmap_t o_mmap = dlsym(RTLD_NEXT, "mmap");
return (*o_mmap)(start, length, prot, flags, fd, offset);
}
然后,上面的库可以拦截来自任何给定程序的任何mmap()系统调用:
$ LD_PRELOAD=./preload.so ./my_prog
尽管my_prog
在打开真实设备节点后尝试mmap()
设备,但为什么我一直获得0和0作为主要和次要数字?
有没有任何方法可以在预加载的mmap()系统调用中获得主要和次要数字,而不需要任何其他信息,除了传递给函数本身的参数之外?
mmap()也会被许多其他代码调用,例如
- 加载/映射共享库
- 为了获得匿名内存(例如malloc()可能会调用mmap来获得更多内存)
在第一种情况下,mmap()的ed文件只是一个常规文件,其minor/major值为0。在第二种情况下,传入的fd不是有效的fd-应用程序应该将-1作为fd传递,但可能不是。。
您可能会看到这些来自运行时的mmap()调用,以及间接来自其他库调用您的应用程序,而不仅仅是应用程序对设备的mmap()调用。
例如,在Linux/glibc上,以及可能的其他系统上,我认为mmap()
调用可以编译为调用mmap64()
,这取决于用于启用大文件支持的编译器标志。您可能需要拦截mmap64()
和mmap()
目前还不清楚你真正想做什么,但你可以
- 检查fd是否为-1
- 检查标志是否不包含MAP_ANONYMOUS
- 然后执行fstat
- 检查S_ISCHR()或S_ISBLK()的
struct stat
.st_mode(请参阅stat手册页),以了解mmap()是否用于设备文件 - 如果
sb.st_rdev
是您感兴趣的主要/次要号码,请采取行动
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 如何将PERF_AMPLE_READ与mmap一起使用
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- 从结构寻址时,MMAP变量的行为很奇怪
- mmap无法按预期工作(返回随机0xdeadbeef)
- fstat()在预加载的mmap()系统调用中无法按预期工作