LINUX.ORG.RU

Binary compatibility в Си

 ,


0

1

Привет! Допустим, есть библиотека с функцией, которая возвращает объект структуры в стеке. Например

struct Data
{
    int size;
    void *data;
};

struct Data getData();


В новой версии библиотеки я хочу расширить структуру Data, но сохранив бинарную совместимость. На ум приходит только добавление пустого массива фиксированной длины в изначальную структуру, забирая оттуда элементы по мере добавления новых полей в структуру:

/* VER 1 */
struct Data
{
    int32_t size;
    void *data;

    char reserved[32];
};


/* VER 2 */
struct Data
{
    int32_t size;
    void *data;

    int32_t new_data;
    char reserved[28]; /* -4 */
};


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

Как есть ещё мысли как обеспечить бинарную совместимость?

★★★

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

Однако и тут нужно думать о выравнивании

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

char reserved

Так ты просто сделай char[SIZE] и в нём уже структуру. Ну т.е. функции будут принимать этот opaque массив (можешь его тайпдефнуть, если хочется) и кастовать его в структуру.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Если ты хлопочешь про ABI, то должен явно и задать выравнивание и порядок байт

Кажется я такое видел в структурах ядра. Там выравнивание иногда делается руками (созданием неиспользуемых полей в структуре) на какую-то определённую границу. Не знаю насколько это вообще надёжно для задач user-space.

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

хотя бы на порядок полей

ЕМНИП это требуется стандартом.

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.