1

我已经发布了以下问题,得到了解决方案并继续前进,
我正在使用 ptrace 查找传递给系统调用的所有参数。
该程序正在获取我在 ebx、ecx、edx 中的值。现在,对于一个开放的系统调用,我知道了

系统调用 5:ebx:bf9748af ecx:00008000 edx:00000000 /打开
系统调用 5:ebx:80485b3 ecx:00000242 edx:000001b6 /打开

我使用了 strace,它神奇地转换了上面的内容,如下所示:

打开(“test.txt”,O_RDONLY|O_LARGEFILE)=3
打开(“test.txt”,O_RDWR|O_CREAT|O_TRUNC,0666)=3

我该如何手动执行此操作?有什么地方可以找到 O_LARGEFILE 的值吗?
我搜索了很多并遇到了这个但它没有一切。还尝试阅读 strace 代码,但没有遇到此转换的代码。
如果有人可以帮助我,那将对我非常有帮助。另外,如果您知道这是在 strace 中写的,我想看看它。提前致谢。

4

2 回答 2

1

O_LARGEFILE是特定于实现的,在 LSB(Linux 标准库)中定义为

0100000(等于0x8000)对于 Linux x86(在fcntl.h

参见 LSB 参考:

http://linuxbase.org/navigator/browse/constant.php?cmd=list-by-name&Cname=O_LARGEFILE

O_RDONLY值是0O_RDONLY | O_LARGEFILE则等于0x8000

于 2012-03-20T07:25:51.363 回答
1

您可以从此头文件中读出这些值:

#define O_ACCMODE      0003
#define O_RDONLY         00
#define O_WRONLY         01
#define O_RDWR           02
#define O_CREAT        0100 /* not fcntl */
#define O_EXCL         0200 /* not fcntl */
#define O_NOCTTY       0400 /* not fcntl */
#define O_TRUNC       01000 /* not fcntl */
#define O_APPEND      02000
#define O_NONBLOCK    04000
#define O_NDELAY    O_NONBLOCK
#define O_SYNC       010000
#define O_FSYNC      O_SYNC
#define O_ASYNC      020000

但是可移植的方法是使用这些值的宏。

于 2012-03-20T07:28:21.457 回答