LINUX.ORG.RU

Линковка с библиотекой, с компилированной с другим _FILE_OFFSET_BITS


0

0

Есть программа, скомпилированная с _D_FILE_OFFSET_BITS=64(этого требует libfuse). В то же время программа линкуется с библиотекой(libzip), которая компилируется без указания этого дефайна и, следовательно, на 32-битной системе имеет _FILE_OFFSET_BITS=32.

При этом мне надо из библиотеки со оффсетом в 32 получать тип данных off_t, который имеет различный размер при разных _FILE_OFFSET_BITS.

Кусок кода:

struct zip_stat stat;
zip_stat_index(zf, i, 0, &stat);

zip_stat_index описан так: int zip_stat_index(struct zip *, int, int, struct zip_stat *);

struct zip_stat {
const char *name; /* name of the file */
int index; /* index within archive */
unsigned int crc; /* crc of file data */
time_t mtime; /* modification time */
off_t size; /* size of file (uncompressed) */
off_t comp_size; /* size of file (compressed) */
unsigned short comp_method; /* compression method used */
unsigned short encryption_method; /* encryption method used */
};

Вопрос: можно ли как-нибудь без грязных хаков получить из библиотеки правильное число, а не 32 бита правильных данных + 32 бита мусора в off_t главной программы?

★★

Напиши несколько протых функций-врапперов к libzip и скомпилируй их с _FILE_OFFSET_BITS=32. И пусть эти функции принимают/возвращают не off_t, а например uint32_t, чтобы ты их мог вызывать из основной программы, собранной с _FILE_OFFSET_BITS=64.

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

> Напиши несколько протых функций-врапперов к libzip и скомпилируй их с _FILE_OFFSET_BITS=32. И пусть эти функции принимают/возвращают не off_t, а например uint32_t, чтобы ты их мог вызывать из основной программы, собранной с _FILE_OFFSET_BITS=64.

А разве можно так компилировать отдельные функции? Или имелись в виду отдельные модули?

Тогда другой вопрос: а как определить, что я на 32-битной системе компилируюсь? sizeof(int) ?

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

Не хочется этого говорить, но при таких вводных единственный разумный ответ - "Вдоль".

anonymous
()
Ответ на: комментарий от gaa

> Тогда другой вопрос: а как определить, что я на 32-битной системе компилируюсь? sizeof(int) ?

Пардон, туплю. В целом идея понятна.

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

Не совсем понял вводные...

Как я понимаю, это _в любом_ случае будет "грязный хак", поскольку на 32-битной системе с _D_FILE_OFFSET_BITS=64 вполне могут жить терабайтные файлы, которые libzip после всех этих врапперов благополучно превратит в кашу...

Die-Hard ★★★★★
()
Ответ на: комментарий от gaa

>> А разве можно так компилировать отдельные функции? Или имелись в виду отдельные модули?

Просто отдельный *.c/*.cpp файл с врапперами, который будет коммпилироваться с _FILE_OFFSET_BITS=32.

Deleted
()
Ответ на: комментарий от Die-Hard

> Как я понимаю, это _в любом_ случае будет "грязный хак", поскольку на 32-битной системе с _D_FILE_OFFSET_BITS=64 вполне могут жить терабайтные файлы, которые libzip после всех этих врапперов благополучно превратит в кашу...

Как я посмотрел по коду libzip, там используется то, что в zip-архиве его размер хранится в виде поля длиной в 4 байта. Так что никого он в кашу не превратит, как я понял.

P.S. Я написал авторам libzip предложение отдавать размер файла всегда в uint32_t, но они пока что не ответили.

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

> что в zip-архиве его размер хранится в виде поля длиной в 4 байта.

Как я понимаю, это значит, что с длинными файлами на 32-х системах он работать просто не умеет. И дело тут не в _FILE_OFFSET_BITS=32. А на 64-х битнах системах off_t всегда -- 8ми битный.

Die-Hard ★★★★★
()
Ответ на: комментарий от gaa

> ...отдавать размер файла всегда в uint32_t

Не понимаю... На 32-й системе при _FILE_OFFSET_BITS=32 off_t отличается от uint32_t только интерпретацией знакового бита.

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

> Как я понимаю, это значит, что с длинными файлами на 32-х системах он работать просто не умеет.

zip принципиально не умеет работать с длинными файлами. На любой системе.

> И дело тут не в _FILE_OFFSET_BITS=32. А на 64-х битнах системах off_t всегда -- 8ми битный.

Ну вот, на 64-битной системе у меня размеры совпадают и всё передаётся правильно. А на 32-битной хрень получается.

> Не понимаю... На 32-й системе при _FILE_OFFSET_BITS=32 off_t отличается от uint32_t только интерпретацией знакового бита.

Библиотека libfuse ставит мне условие: "или компилируй везде с _FILE_OFFSET_BITS=64 или я не скомпилируюсь". Теперь понятно, почему у меня главная программа компилируется с 64-битным оффсетом?

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

Теперь понял :-)

Тогда, как уже сказали -- компили врапперы с _FILE_OFFSET_BITS=32, которые конвертнут off_t в int64_t -- будет работать независимо от того, какая у тебя сиcтема.

Только учти, что off_t -- знаковый, не думай про него как про uint32_t

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

> компили врапперы с _FILE_OFFSET_BITS=32, которые конвертнут off_t в int64_t -- будет работать независимо от того, какая у тебя сиcтема.

Скорее всего, я его просто не буду указывать, чтоб скомпилился с системным значением.

> Только учти, что off_t -- знаковый, не думай про него как про uint32_t

Знаю-знаю. Просто уж в том виде, в котором он применяется в libzip он не может оказаться отрицательным.

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

> ...чтоб скомпилился с системным значением.

Я не уверен, но что-то мне вспоминается, что на некоторых дистрибутивах по умолчанию выставляется в хедерах _FILE_OFFSET_BITS=64... Впрочем, на таких дистрибутивах и библиотеки все должны быть скомпилены с аналогичным off_t.

Кстати, а что, твое творение на 32 битах по определению упирается в 2 GB предел?

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

> Я не уверен, но что-то мне вспоминается, что на некоторых дистрибутивах по умолчанию выставляется в хедерах _FILE_OFFSET_BITS=64... Впрочем, на таких дистрибутивах и библиотеки все должны быть скомпилены с аналогичным off_t.

Вот-вот.

> Кстати, а что, твое творение на 32 битах по определению упирается в 2 GB предел?

Дык, оно и на 64битах упрётся. Это ограничение растёт из формата zip-архива.

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