Доброго всем!
Есть несколько подходов к FFI, но не один из них мне не понравился,
когда понадобилось сделать интерфейс к stat_t. Проблема - в том, что
типы в ней определены слишком сложно и трудно не ошибиться. Особенно
непонятно, как сделать FFI переносимым.
struct stat
{
__dev_t st_dev; /* Device. */
unsigned short int __pad1;
#ifndef __USE_FILE_OFFSET64
__ino_t st_ino; /* File serial number. */
#else
__ino_t __st_ino; /* 32bit file serial number. */
#endif
__mode_t st_mode; /* File mode. */
....
__nlink_t st_nlink;
#ifndef __USE_FILE_OFFSET64
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
#else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
В итоге, я придумал вот что:
1. Пишем вот такую программку:
//gdb-grovel.c
#include <sys/stat.h>
int main(int args, char**argv) {
struct stat test;
return 0;
}
//eof
2. Собираем:
$gcc -g -m32 -fPIC -o gdb-grovel gdb-grovel.c
3. Запускаем gdb:
$gdb gdb-grovel
4. В gdb делаем следующее:
(gdb)break main
(gdb)r
; gdb останавливается в breakpoint
(gdb)ptype test
type = struct stat {
__dev_t st_dev;
short unsigned int __pad1;
...
}
Если мы перенаправим вывод gdb в файл, мы узнаем перечень полей
структуры. Его можно распарсить и для каждого поля узнать его тип:
(gdb) whatis test.st_dev
type = __dev_t
(gdb) whatis __dev_t
type = __u_quad_t
(gdb) whatis __u_quad_t
type = long long unsigned int
Таким образом, у нас есть полная инфа о типе и осталось только
собрать из неё определение FFI.
Вопросы:
1. Нов ли этот подход?
2. Если не нов, известны ли в нём какие-то подставы?
3. Если всё в порядке, то есть ли где-то доведённая до приличного
уровня реализация генератора FFI (для любого языка)?
4. Или я лох и что-то недопонимаю и можно всё сделать и так?
Я генерю FFI для Common Lisp, вроде уже попробовал SWIG и
cffi-grovel, результат примерно одинаковый.
Ответ на:
комментарий
от tailgunner
Ответ на:
комментарий
от den73
Ответ на:
комментарий
от tailgunner
Ответ на:
комментарий
от den73
Ответ на:
комментарий
от tailgunner
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от Begemoth
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от Begemoth
Ответ на:
комментарий
от anonymous
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум [c] Почему к имени поля структуры добавляют сокращенное имя структуры? (2011)
- Форум Валиден ли код? (2018)
- Форум alsa запись в mp3 (2010)
- Форум [X11]Не могу понять, где по-нормальному объявлена структура Display (2011)
- Форум трассировка icmp (2016)
- Форум Непонятная ошибка распределения памяти (2016)
- Форум FUSE (2013)
- Форум Вывести содержание бинарного файла (2013)
- Форум Максимальное колличество MPLS POP меток на оборудовании (2017)
- Форум Прога компилится в Linux, но не компилится в Cygwin (2006)