2009-10-27 1 views
5

Согласно Linux man page for mprotect функция имеет 3 аргумента:функция mprotect вызывается с 5 аргументов

int mprotect(const void *addr, size_t len, int prot); 

, но во время работы ltrace на программу, я анализирующей я вижу, что mprotect называется так:

mprotect(0x8049000, 4096, 3, 1, 0xb7e057ac)  = 0 

Что такое 4-й и 5-й аргументы?

Редактировать: Использование версии ltrace 0.5. и ядро ​​2.6.24-24-родовой

благодаря

+0

Как насчет пятой один? – Cascabel

+0

извините, при сканировании аргументов я пропустил четвертый;) – woolagaroo

+0

Какая версия strace. Какая версия ядра Linux? – Puppe

ответ

7

Пять есть число аргументов, ltrace будет печатать, если он не может найти описание функции в конфигурационном файле. (/etc/ltrace.conf по умолчанию, я думаю).

В моей системе я вижу одно и то же поведение, и mprotect там не найден, только SYS_mprotect.

Если вы хотите иметь второй вид источника ltrace, то местом интереса является output.c, условное значение после «func = name2func (имя_функции)»; - который печатает 5 аргументов в случае, если мета-информация для имени функции не найдена (и в этом случае линейный поиск в имени2func возвращает NULL).

Таким образом, руководство является правильным, это ltrace что «неправильно» (цит «неправильно», потому что технически код работает как надо, хотя, вероятно, DEFS в конфигурации должен быть установлен)

+0

В наши дни это похоже на 'ret-> num_params = 4;' в 'build_default_prototype'. Спасибо за этот комментарий, однако, это помогло мне узнать, как ltrace определяет # args от неизвестной функции. Я надеялся, что это будет какой-то волшебный алгоритм. – wump

Смежные вопросы