Ядерная нестыковочка

Aug 14, 2017 13:54

В процессе программирования модулей ядра Linux нередко приходится прибегать к помощи ассемблера. Традиционно разработчики ядра используют встроенный ассемблер GCC (который по сути является шлюзом в GAS), но у этого подхода есть куча недостатков, что вызывает желание использовать посторонний ассемблер и раздельную трансляцию. Кстати, знаменитый Свен ( Read more... )

непонятки, #include, *nix, быдлокодинг

Leave a comment

Comments 5

oboguev September 29 2017, 12:48:29 UTC
#define CDECL __attribute__ ((__cdecl__))

extern int CDECL madd(int, int);

Reply

sp_r00t October 2 2017, 08:05:31 UTC
Не получается.
Компилятор выдаёт предупреждение (не ошибку), что ему неизвестен символ перед madd (при этом не уточняет, какой именно) и он использует дефолтный int в прототипе, ну а дальше компилирует с передачей чисел через регистры((((

Reply

oboguev October 2 2017, 11:28:34 UTC
Действительно, запамятовал.
CDECL поддерживается только в x86_32 (gcc -m32).
В x64 под Линуксом gcc поддерживает только System V AMD64 ABI.
Аттрибут ms_abi игнорируется.

https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html#x86-Function-Attributes
https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI

Reply

sp_r00t October 2 2017, 11:46:03 UTC
Так у меня вроде 32-хбитный линукс...
Может дело в синтаксисе атрибутов?
Я просто ранее никогда их не использовал и несколько "плаваю".
Через Вашу первую ссылку заглянул на
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
и там почему то атрибуты пишутся после аргументов функции.
И попробовать пока не могу - на работе под виндой сижу)))

Reply


Leave a comment

Up