Автор Тема: Большой файл и 32 битный дистрибутив ALT Linux [решено]  (Прочитано 1455 раз)

Оффлайн тугодум

  • Давно тут
  • **
  • Сообщений: 36
23.12.2017 10:01:00
для удобства укажу постановку задачи и решение в начале

дано:
 программы на языке Си и некоторые пакеты (см. ниже)
   не работают с файлами длиной более 2ГБ
    в 32 битных дистрибутивах ALT Linux

требуется:
 почти ничего не меняя в исходниках (или вообще ничего)
  обеспечить работу с Большими файлами на 32 битах

решение: 
 добавить  макрос в исходники
  #define  _FILE_OFFSET_BITS  64

 или указать опцию при компиляции
   -D_FILE_OFFSET_BITS=64

пример компиляции программы gost3411-2012 из пакета streebog:
 gcc -march=i686 -msse2 -D_FILE_OFFSET_BITS=64 gost3411-2012-core.c gost3411-2012.c

использованная литература:
  1. man feature_test_macros
  2. GCC Гриффитс А. 2004г. 624с.

************************************************************************************************
*  далее идёт "старая" постановка задачи и решение
*  + уточнение:
*       4. Библиотека - glibc
************************************************************************************************
27.10.2017 21:30:00
требуется:
 указать функции вместо fopen() fread() fwrite() fseek() fclose()
   которыми следует пользоваться в этом случае
    а также используемую системную библиотему и способ компиляции.

решение:
 1. функции open(), read(), write(), lseek(), close()
 2. флаг "O_LARGEFILE" в open()
 3. конфигурационная константа "_GNU_SOURCE" в начале
 4. системные библиотеки и способ компиляции - стандартные

пример:
  // следующая строка ставится в самом начале
  //  она разрешает применение флага O_LARGEFILE
  #define _GNU_SOURCE 1
  #include <fcntl.h>
  int main(){
      int f = open("файл_2ГБ",O_RDONLY | O_LARGEFILE);
  }

****************************************************************
*  отсюда тема берёт Начало
*     старое название темы:                                           
*       "streebog + файл_2ГБ + p8_32 = не работает"   
*****************************************************************
> gost3411-2012  файл_2ГБ
выдаёт:
    gost3411-2012: файл_2ГБ: Value too large for defined data type
т.е. не работает.

файлы размером меньше 2ГБ читаются streebog нормально.

проблема в функции fopen()
  см. gost3411-2012.c  строка 377.
 
« Последнее редактирование: 23.12.2017 23:59:26 от тугодум »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
Повешайте багу, пожалуйста.
« Последнее редактирование: 28.10.2017 20:00:33 от sb »
Андрей Черепанов (cas@)

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 222
Повешайте багу, пожалуйста.
причем наверно на https://github.com/adegtyarev/streebog
« Последнее редактирование: 28.10.2017 20:00:23 от sb »

Оффлайн тугодум

  • Давно тут
  • **
  • Сообщений: 36
« Последнее редактирование: 28.10.2017 20:00:09 от sb »

Оффлайн тугодум

  • Давно тут
  • **
  • Сообщений: 36
тест: программа + файл_2ГБ + р8_32 =
   arj       -
   bzip2  +
   bcrypt  -
   gpg      +
   rhash   -
   md5sum  +
здесь: "+" = работает, "-" = не работает

это навскидку, все программы я не проверял.
т.е. проблема ШИРЕ отдельно взятого пакета streebog.
   
поэтому передлагаю изменить название темы на следующее:
 "Как работать с большими файлами в 32 битных дистрибутивах ALT Linux"
и/или переместить в раздел Wiki "Руководство программиста".

в этой теме прошу уважаемых сотрудников ALT Linux указать
 функции вместо fopen() fread() fwrite() fseek() fclose()
   которыми следует пользоваться в этом случае
    а также используемую системную библиотему и способ линковки.

я думаю такой ответ вполне может уложиться в одну строку.
  Это позволит не отвлекать уважаемых сотрудников ALT Linux от работы
    и решать пользователям свои проблемы самостоятельно.
« Последнее редактирование: 28.10.2017 19:59:59 от sb »

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 222
это не касается конкретно AltLinux, а более общая проблема  работы с большими объемами данных при ограниченной адресации.
« Последнее редактирование: 28.10.2017 19:59:46 от sb »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
тест: программа + файл_2ГБ + р8_32 =
   arj       -
   bzip2  +
   bcrypt  -
   gpg      +
   rhash   -
   md5sum  +
здесь: "+" = работает, "-" = не работает

это навскидку, все программы я не проверял.
т.е. проблема ШИРЕ отдельно взятого пакета streebog.

Хм-м...
# grep 'model name' /proc/cpuinfo
model name      : Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
# free -m
             total       used       free     shared    buffers     cached
Mem:          8040       7762        277          0         35       6118
-/+ buffers/cache:       1608       6431
Swap:        20481         86      20394
# uname -r
3.14.79-std-pae-alt0.M70P.1
# apt-repo
rpm [p7] http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch i586 classic
rpm [p7] http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch noarch classic
# du -m ./file.iso
3739    ./file.iso
# time -f %E hexdump ./file.iso|tail -n1
10:02.56
e9747000
# time -f %E rhash --md5 ./file.iso
f95dbf70b36b559d61568f481eb2fd2b  file.iso
0:22.82
# time -f %E md5sum ./file.iso
f95dbf70b36b559d61568f481eb2fd2b  ./file.iso
0:09.96
# time -f %E rhash --gost ./file.iso
3abe45b7795b010d136f9a319fafb451dbd063abfbc874e3a935a48656db549c  file.iso
1:17.92

И hexdump отработал. И rhash отработал. Причём точно отработал и контрольная сумма совпадает с полученной через md5sum. Нужно смотреть на чём оно рвануло.
« Последнее редактирование: 28.10.2017 19:59:35 от sb »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
это не касается конкретно AltLinux, а более общая проблема  работы с большими объемами данных при ограниченной адресации.

Согласен с Андреем.
:-) Иначе получится что Linux хуже спектрумовского iS-DOS:
Адресуемое пространство в Спэке - 65535. Но нехитрыми операциями можно получить файл до 5.29MB.
Тут упоминается в описании уровня DUD.SYS ядра:
http://zxpress.ru/book_articles.php?id=1739
« Последнее редактирование: 28.10.2017 19:59:23 от sb »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Ещё один прогон на sysv p8 32bit:
# grep 'model name' /proc/cpuinfo
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
# free -m
             total       used       free     shared    buffers     cached
Mem:          8017       2001       6015          0         91        643
-/+ buffers/cache:       1266       6750
Swap:        10607          0      10607
# uname -r
4.4.85-std-pae-alt0.M80P.1
# apt-repo
rpm [p8] http://mirror.datacenter.by/pub/ALTLinux p8/branch/i586 classic
rpm [p8] http://mirror.datacenter.by/pub/ALTLinux p8/branch/noarch classic
# du -m ./slackware-current-live-toshiba.img
3699    ./slackware-current-live-toshiba.img
# time -f %E md5sum ./slackware-current-live-toshiba.img
2594bec6cb816eae237a4fffffc6ec0f  ./slackware-current-live-toshiba.img
0:39.68
# time -f %E rhash --md5 ./slackware-current-live-toshiba.img
2594bec6cb816eae237a4fffffc6ec0f  slackware-current-live-toshiba.img
0:11.79
# time -f %E rhash --gost ./slackware-current-live-toshiba.img
9bd12231183132fe7f22830dbd9bf8f5bdfe3986266045e9c48a7921e738b8b3  slackware-current-live-toshiba.img
1:51.23

Можно ещё посмотреть с классическим 32 bit Pentium M 770 на двух гигах памяти, но большой файл надо поискать и там будет из сизифа.
« Последнее редактирование: 28.10.2017 19:59:12 от sb »

Оффлайн тугодум

  • Давно тут
  • **
  • Сообщений: 36
если никто не возражает
    я сменю название темы.
« Последнее редактирование: 28.10.2017 19:58:59 от sb »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Тот же ноутбук, другой флавор ядра:
# grep 'model name' /proc/cpuinfo
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz
# free -m
             total       used       free     shared    buffers     cached
Mem:          2460        756       1704          0         46        327
-/+ buffers/cache:        382       2077
Swap:        10607          0      10607
# uname -r
4.9.58-std-def-alt0.M80P.1.1
# apt-repo
rpm [p8] http://mirror.datacenter.by/pub/ALTLinux p8/branch/i586 classic
rpm [p8] http://mirror.datacenter.by/pub/ALTLinux p8/branch/noarch classic
# du -m ./slackware-current-live-toshiba.img
3699    ./slackware-current-live-toshiba.img
# time -f %E md5sum ./slackware-current-live-toshiba.img
2594bec6cb816eae237a4fffffc6ec0f  ./slackware-current-live-toshiba.img
0:39.27
# time -f %E rhash --md5 ./slackware-current-live-toshiba.img
2594bec6cb816eae237a4fffffc6ec0f  slackware-current-live-toshiba.img
0:40.54
# time -f %E rhash --gost ./slackware-current-live-toshiba.img
9bd12231183132fe7f22830dbd9bf8f5bdfe3986266045e9c48a7921e738b8b3  slackware-current-live-toshiba.img
2:27.43

Остаётся последний вариант:
Посмотреть на классическом 32-хбитном Pentium M 770, память 2GB?, но это уже будет Сизиф.

Оффлайн andrew_b

  • Завсегдатай
  • *
  • Сообщений: 534
я думаю такой ответ вполне может уложиться в одну строку.
Действительно: AC_SYS_LARGEFILE


Оффлайн тугодум

  • Давно тут
  • **
  • Сообщений: 36
rhash - работает
  извиняюсь.

Оффлайн Altexander

  • Давно тут
  • **
  • Сообщений: 43
    • Email
Как-то давно ваял прогу на wxWidgets, нарезающую >4 ГБ файлы, так там тоже столкнулся с тем, что счётчик записанных байтов начинался с нуля после то ли 4 ГБ (unsigned int), то ли 2ГБ (signed int), и под Windows, и под Linux (собирал под 32 бит).

Оффлайн andrew_b

  • Завсегдатай
  • *
  • Сообщений: 534
Ну так как решено-то? А то тему пометили, а о результате ни слова.