LINUX.ORG.RU

Не хватает констант в asm/unistd.h

 , ,


0

1

Итак, есть библиотека, которая использует константы из asm/unistd.h через макрос и не находит следующие:

  • __NR_accept
  • __NR_sendmsg

Собираю на 32-битной машине. Эти константы имеются в asm/unistd_x32.h и asm/unistd_64.h, а в нужном мне файле asm/unistd_32.h они почему-то не определены. Это нужно для реализации функционала с учетом заголовков linux/filter.h, linux/seccomp.h.

С kernel abi не сталкивался до этого, так что даже не знаю как правильно поступить. Может это проблема дистрибутива, файлы старые или еще что-то? Как решить проблему? Или это работает только для 64-битных машин?

Файлы на pastebin (если кто не верит):

Ядро: i686 4.1.15

P.S. Пока что вырезал через #ifndef __i386__ на то, что ругалось.

★★★★★

Последнее исправление: gh0stwizard (всего исправлений: 1)

Я не совсем понял, как стоит задача, и почему нужно привязываться к системным asm/ заголовочным файлам (их использовать вообще-то не рекомендуется, «должно хватать linux/», как я где-то читал).

Если не хватает низкоуровневых ядерных дефайнов, можно их вписать у себя. Подобное я встречал в hdparm. Там, чтобы решить задачу недоступности некоторых данных из заголовочных файлов ядра, эти данные были объявлены в своих заголовочных файлах.

Andrey_Utkin ★★
()
Ответ на: комментарий от Andrey_Utkin

почему нужно привязываться к системным asm/

Проект молодой, так автор написал. Похоже из-за того, что ему не наприсылали патчей он забыл проставить ifdef на все случаи. Я сейчас все причесал, и думаю, что задача решится.

Вообще, из-за того, что не знаю всех тонкостей kernel abi, мне не ясно почему для одной архитектуры проставлены константы, а для другой нет: accept, sendmsg есть и там и сям...

gh0stwizard ★★★★★
() автор топика

Под x86 все вызовы сокетов вроде через единственный системный вызов __NR_socketcall диспетчеризуются, а не по одному на операцию (__NR_accept, __NR_sendmsg и т.д.), как в более поздних архитектурах.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)
Ответ на: комментарий от Andrey_Utkin

Если не хватает низкоуровневых ядерных дефайнов, можно их вписать у себя.

вписать можно. только ядерные дефайны - это, знаете ли, ядерные дефайны. скармливать кернелу неизвестные ему константы - задача познавательная, но малопродуктивная.
если кернел старый - курить socketcall.

Iron_Bug ★★★★★
()
#include <linux/syscalls.h>

Должен притянуть за собой все, что нужно.

Если не притягивает, значит переписывать.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.