Это похоже на ошибку в реализации NLFFI SML/NJ. Функция СNLFFI: неправильные значения отправляются на аргументы функции C типа «short»
void f0
(short a0
, short a1
и так далее
, short a7
) {
printf ("a0 == %hx\n", a0);
printf ("a1 == %hx\n", a1);
и так далее
printf ("a7 == %hx\n", a7);
}
компилировать его
GCC -shared -fPIC -m32 -o libdelme .so _.c
и установить. Призывании из С
f0 (0x7654, 0x3210, 0x9876, 0x5432, 0x1234, 0x5678, 0x9012, 0x3456);
печатает правильные значения, и вызов от ML
F_f0.f' (0x7654, 0x3210, 0x9876, 0x5432, 0x1234, 0x5678, 0x9012, 0x3456);
печатает этот
a0 == 7654
a1 == 9876
a2 == 1234
a3 == 9012
a4 == 0
a5 == 1800
a6 == 3cf0
a7 == ee00
Аналогичный эффект с signed char
. Кажется, что в моей библиотеке C ожидаются аргументы, согласованные с 2^5-битным адресом, и NLFFI не выравнивает их.
Я столкнулся с этой ошибкой при создании привязки к XCB, поэтому я не могу изменить его заголовочные файлы, прототипы функций и т. Д. Все уже подготовлено в моем дистрибутиве Linux.
Возможно, это связано с тем, что я перекрестно скомпилировал, то есть скомпилировал код x86 на AMD64.
SML/NJ версия
$ pacman -Q smlnj
smlnj 110.77-1
Не знал, что после переменного аргумента можно добавить дополнительные конкретные аргументы. Как это работает? – dhein
@Zaibis: «...» означает «и так далее». Правильно, это сбивает с толку. :) – beroal
ahhh right, теперь я получаю смысл вашего вопроса>. < – dhein