LINUX.ORG.RU

32-х битный софт на 64-х битной ФС

 ,


0

3

У нас распределенное хранилище переехало с ФС lustre на sonas, после чего 32-х битный софт резко перестал работать. Оказалось, что у новой ФС иноды 64-х битные, а наш софт скомпилен без D_FILE_OFFSET_BITS=64 (или какая там опция за это отвечает).

Софт 32-х битный, и тащить его в 64 — не вариант. Даже заставить чуваков, ответственных за сборку, добавить флаг компиляции скорее всего не удастся. Поэтому вопрос: можно ли как-нибудь решить проблему во время запуска? Скажем с помощью LD_PRELOAD какой-нибудь хитрой самопальной библиотеки которая подменит всякие fopen32 на fopen64? Или чего-нибудь в этом духе.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)
Ответ на: комментарий от anonymous

«Отправьте смс на короткий номер и узнайте как»?

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

D_FILE_OFFSET_BITS=64 не влияет на битность софта

Reset ★★★★★
()

резко перестал работать

О, один из тех, кто пишет в суппорт: «НИУЯ НЕ РАБОТАЕТ!!!!!!1111».

Где нормальное описание проблемы?

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

Оказалось, что у новой ФС иноды 64-х битные, а наш софт это не поддерживает.

Учимся читать первопост до конца?

trex6 ★★★★★
()

Непонятно, что именно в ФС стало 64-битным и как это касается вашей проги. Да, я вижу в тексте слово «иноды», но понятнее не становится.

_FILE_OFFSET_BITS касается позиций в файлах. Если у вас все файлы были короче двух гигов, а тут вдруг появился длинный и всё сломалось — это оно. Иначе нет.

const86 ★★★★★
()

резко перестал работать

Это не описание проблемы.

иноды 64-х битные

Ваш софт копается в низкоуровневых структурах файловой системы? Тогда при чем тут какие-то fopen64?

Пожалуйста, попробуйте сконцентрироваться и описать проблему ВНЯТНО. Уверен - Вы этим наполовину ее решите.

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

Учимся читать первопост до конца?

Оказалось, что у новой ФС иноды 64-х битные, а наш софт это не поддерживает.

Я это читал. ТС почему-то решил, что не поддерживает, но не написал, в чём это выражается. Каковы изначальные симптомы, может проблема совершенно не в этом?

Собственно у меня 64битная система и inode'ы 64битные, но

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv) {
    struct stat st = {0};
    if(-1 == stat(argv[0], &st)) {
        printf("Error\n");
        return EXIT_FAILURE;
    }
    printf("%lu\n", st.st_ino);
    return EXIT_SUCCESS;
}
     

У меня всё работает:

$ uname -rm
3.2.0-3-amd64 x86_64
$ i686-unknown-linux-gnu-gcc -Wall test.c -o test
$ file test
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.2.20, not stripped
$ ./test 
24912600
$ ls -li ./test
24912600 -rwxr-xr-x 1 del del 5939 Jul 30 07:10 ./test

Если ТС хочет, чтобы ему помогли, нужно описание проблемы со всеми симптомами без его догадок, тк очевидно, что у него самого каша в голове. Например, GLIBC'шный дефайн _D_FILE_OFFSET_BITS никакого отношения к размеру поля i_ino структуры struct inode не имеет.

DELIRIUM ☆☆☆☆☆
()

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

можно ли как-нибудь решить проблему

Можно страдать.

anonymous
()

DELIRIUM, svu, const86,
Пожалуйста, внятное описание проблемы:

gccxml_cc1plus: error: test.cxx: Value too large for defined data type
Легче стало?

Если данную тулзу скомпилять в 64бита или с флагом, то все работает. Вот только тулчейн у нас идет в составе софта, и подменить бинарник мы не можем.

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

Ну вот же первая ссылка из гугла на эту ошибку: http://stackoverflow.com/questions/2438890/cc1plus-error-include-value-too-la...

Пишут что да, stat(2) от больших значений inode дуреет, ошибка EOVERFLOW.

Может быть можно перемонтировать эту sonas с другими параметрами?

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

Надо же, анон, ты такой умный! Ты только что выяснил все то, что я описал в первом же посте.

Если бы у проблемы было легкое решение, я бы на ЛОР не лез.

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

Собрать либку со своей функцией stat. Которая вызывает системную функцию stat и курежит ее параметры (или вообще напрямую делает сисколл в ядро и разбирается с результатами). Но могут появиться какие-нибудь другие проблемы.

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

Что такое стат32 и стат64 в линуксе??

svu ★★★★★
()

Софт 32-х битный, и тащить его в 64 — не вариант.

ИМХО это _единственный_ вариант.

Костыли всё равно отвалятся. Впрочем — дело ваше. Я давно уже на 64.

drBatty ★★
()

а ченьч рут с 32х битным окружением не спасет? или вообще в виртуалке запустить (обозвать это как «переход на облачные технологии»)?

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

У нас тут и так гриды и сплошные облачные технологии.

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

Надо же, анон, ты такой умный! Ты только что выяснил все то, что я описал в первом же посте.

А, у тебя еще и с осознаванием текста не очень. Бывает.

Давай еще раз, попроще. Ключевые слова были «гугл», «перемонтировать с другими параметрами». Как слышно, прием?

Ты как этот sonas монтируешь? В документации (внимание, это еще одно ключевое слово) пишут что он умеет быть CIFS/SMB, NFS или еще чем-то. В зависимости от этого нужно погуглить (ну ты понел) <твоя_фс> «Value too large for defined data type». Опционально можно добавить 32 bit. С хорошей вероятностью на первой-второй странице ты сможешь найти ответ

Если бы у проблемы было легкое решение, я бы на ЛОР не лез.

Это точно

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