Использование Ptrace, чтобы выяснить, что именно означают аргументы для системного вызова - PullRequest
1 голос
/ 20 марта 2012

Я уже опубликовал следующий Вопрос получил решение и двинулся вперед
Я использую ptrace, чтобы найти все аргументы, которые передаются системному вызову.
Программа извлекает мне значения в ebx, ecx, edx.Теперь для открытого системного вызова я получил следующий

SYSCALL 5: ebx: bf9748af ecx: 00008000 edx: 00000000 / open
SYSCALL 5: ebx: 80485b3 ecx: 00000242 edx: 000001b6 / open

Я использовал strace, и он волшебным образом преобразует вышеперечисленное так:

open ("test.txt", O_RDONLY | O_LARGEFILE) = 3
open ("test.txt ", O_RDWR | O_CREAT | O_TRUNC, 0666) = 3

Как я могу сделать это вручную?Есть ли место, где я могу узнать значения для O_LARGEFILE?
Я много искал и наткнулся на это Но в нем нет всего.Также попытался прочитать код strace, но не встретил код для этого преобразования.
Если кто-то может мне помочь, это было бы очень полезно для меня.Также, если вы знаете, где это написано в strace, я хочу взглянуть на это.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Вы можете прочитать эти значения из этого заголовочного файла :

#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

Но переносимый способ сделать это - использовать макросы для этих значений.

1 голос
/ 20 марта 2012

O_LARGEFILE зависит от конкретной реализации и определяется в LSB (Linux Standard Base) как

0100000 (равно 0x8000) для Linux x86 (в fcntl.h)

См. Ссылку LSB:

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

O_RDONLY значение равно 0, тогда O_RDONLY | O_LARGEFILE равно 0x8000.

...