GETUNWIND(2)

ИМЯ
getunwind - копирует раскрученные данные в буфер вызывающего

ОБЗОР
#include <syscall.h>
#include <linux/unwind.h>

long getunwind(void *buf, size_t buf_size);
Замечание: в glibc нет обёрточной функции для данного системного вызова; смотрите ЗАМЕЧАНИЯ.

ОПИСАНИЕ
Замечание: этот вызов устарел. Специальный системный вызов getunwind() для IA-64 копирует раскрученные данные кадра вызова ядра в буфер, указанный в buf, и возвращает размер раскрученных данных; эти данные описывают шлюзовую страницу (gate page, код ядра, который отображается в адресное пространство пользователя). Размер буфера buf задаётся в buf_size. Данные копируются только, если значение buf_size больше или равно размеру раскрученных данных и значение buf не равно NULL; в противном случае, данные не копируются и вызов завершается без ошибки, возвращая размер, который необходим для хранения раскрученных данных. В начале раскрученных данных содержится таблица раскрутки. После неё хранится связанная с раскруткой информация в произвольном порядке. В таблице раскрутки содержатся записи в следующем виде:
    u64 start;    (64-битный адрес начала функции)
    u64 end;      (64-битный адрес конца функции)
    u64 info;     (смещение относительно BUF на раскрученную информацию)
Запись, у которой значение start равно нулю, указывает на конец таблицы. Подробности формата смотрите в руководстве IA-64 Software Conventions and Runtime Architecture.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении getunwind() возвращает размер раскрученных данных. При ошибке возвращается -1, а в errno задаётся причина ошибки.

ОШИБКИ
Вызов getunwind() завершается с ошибкой EFAULT, если раскрученную информацию невозможно сохранить в пространство, указанное buf.

ВЕРСИИ
Данный системный вызов доступен в Linux начиная с версии 2.4.

СООТВЕТСТВИЕ СТАНДАРТАМ
Данный системный вызов есть только в Linux и доступен только на архитектуре IA-64.

ЗАМЕЧАНИЯ
Данный системный вызов устарел. Современным способом получить раскрученные данные ядра является шлюз DSO. Адрес заголовка ELF этого DSO передаётся на уровень пользователя через AT_SYSINFO_EHDR (смотрите getauxval(3)). В glibc нет обёрточной функции для данного системного вызова; в маловероятном случае, когда вам нужно использовать его, используйте syscall(2).

СМОТРИТЕ ТАКЖЕ
getauxval(3)