Использование Ptrace для выяснения того, что именно означают аргументы для системного вызова

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

СИСТЕМНЫЙ ВЫЗОВ 5: ebx :bf9748af ecx: 00008000 edx: 00000000 /open
СИСТЕМНЫЙ ВЫЗОВ 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, я хочу взглянуть на это. Заранее спасибо.


person kidd0    schedule 20.03.2012    source источник
comment
Я прочитал man 2 open и узнал, что open выполняет побитовое ИЛИ, но полной картины так и не получил :(   -  person kidd0    schedule 20.03.2012
comment
что ты опять пытаешься сделать??   -  person UmNyobe    schedule 20.03.2012
comment
@UmNyobe: я хочу знать, как преобразовать значение 242 в O_RDWR | O_CREAT | O_TRUNC   -  person kidd0    schedule 20.03.2012
comment
@nos: На справочной странице мне было сказано, какие все флаги вы можете использовать, например O_RDWR и т. Д., Но когда они передаются в регистрах, значения представляют собой длинные целые числа. (значения в ebx, ecx) и т. д., я хочу интерпретировать целые значения для этих флагов, которые там не упоминаются.   -  person kidd0    schedule 20.03.2012
comment
Я надеюсь, вы знаете, что эти значения никоим образом не стандартизированы для дистрибутивов Linux...   -  person UmNyobe    schedule 20.03.2012
comment
@ bi0s.kidd0 Значения находятся в файлах заголовков. Вы должны вытащить значения из регистра и сделать побитовое и на каждом из этих флагов, чтобы проверить, какие флаги были установлены.   -  person nos    schedule 20.03.2012
comment
@UmNyobe да, ядро ​​​​linux поддерживает стабильный ABI для пользовательского пространства.   -  person nos    schedule 20.03.2012


Ответы (2)


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

#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

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

person orlp    schedule 20.03.2012
comment
В порядке. Также можете ли вы уточнить, что означает побитовое или на странице руководства? - person kidd0; 20.03.2012
comment
Я понял ответ на свой вопрос, так что принимаю :) Большое спасибо. Если вы можете уточнить это, это поможет мне лучше понять: D - person kidd0; 20.03.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.

person ouah    schedule 20.03.2012
comment
Спасибо, я понял. Жаль, что ответ был прямо передо мной. Мне потребовалось некоторое время, чтобы понять. Очень жаль :( - person kidd0; 20.03.2012