LINUX.ORG.RU
ФорумTalks

Сказ о том, как я xpdf под openSUSE патчил

 , ,


1

1

Значит, дело было так. Где-то в октябре поставил я себе openSUSE Leap 15.2. И обнаружил, что официального пакета xpdf'а нет. Пошёл на software.opensuse.org и нашёл там несколько вариантов пакетов. Взял я там .src.rpm пакет товарища по имени Eric Schirra и форкнул себе от него свой пакет. Однако, итоговый xpdf был несколько нестабилен. В целом работал, но при скроллинге на ряде файлов он внезапно выпадал в segmentation fault. Первая попытка найти причину как-то к результатам не привела и я всё списал на особенности версий библиотек и опций их сборки. Зря.

Вторая серия началась в среду на прошлой неделе. Зарегистрировался я, значит, на forum.xpdfreader.com и написал там: так и так, в openSUSE Leap 15.2 unofficial build выпадает в осадок с segmentation fault'ами, gdb пишет

Thread 4 "xpdf" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffd7fff700 (LWP 28259)]
0x00000000004c9ef7 in SplashXPathScanner::advance (this=this@entry=0xcb51a0, aa=aa@entry=1)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/SplashXPathScanner.cc:309
309             for (s1 = s->prev->prev; s->mx < s1->mx; s1 = s1->prev) ;
...
(gdb) bt
#0  0x00000000004c9ef7 in SplashXPathScanner::advance (this=this@entry=0xcb51a0, aa=aa@entry=1)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/SplashXPathScanner.cc:309
#1  0x00000000004caa24 in SplashXPathScanner::getSpan (this=this@entry=0xcb51a0, 
    line=0xe26280 "\200\305", <incomplete sequence \340>, y=y@entry=36, x0=x0@entry=36, x1=x1@entry=729, 
    xMin=xMin@entry=0x7fffd7ffe7c8, xMax=0x7fffd7ffe7cc)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/SplashXPathScanner.cc:584
#2  0x00000000004b4dba in Splash::fillWithPattern (this=this@entry=0x7fffd0001d70, path=path@entry=0x7fffd00175d0, 
    eo=eo@entry=0, pattern=<optimized out>, alpha=...)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/Splash.cc:5371
#3  0x00000000004bfcb6 in Splash::fill (this=0x7fffd0001d70, path=path@entry=0x7fffd00175d0, eo=eo@entry=0)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/splash/Splash.cc:5303
#4  0x0000000000578116 in SplashOutputDev::fill (this=0x7fffd0005490, state=<optimized out>)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/xpdf/SplashOutputDev.cc:1736
#5  0x00000000004f6830 in Gfx::opFill (this=0x7fffd0004330, args=<optimized out>, numArgs=<optimized out>)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/xpdf/Gfx.cc:1796
#6  0x00000000004ed86c in Gfx::execOp (this=this@entry=0x7fffd0004330, cmd=cmd@entry=0x7fffd7ffe910, 
    args=args@entry=0x7fffd7ffe920, numArgs=numArgs@entry=0)
    at /usr/src/debug/xpdf-4.03-shckr15.2.3.x86_64/xpdf/Gfx.cc:857
...
(gdb) print s
$1 = (SplashXPathSeg *) 0x7fffd0018210
(gdb) print s1
$2 = (SplashXPathSeg *) 0x0
(gdb) print s->mx
$3 = {val = -1592570}
(gdb) print s->prev
$4 = (SplashXPathSeg *) 0xcb51c8
Разработчик xpdf'а попросил прислать ему на электронную почту примеры таких PDF файлов. Я ему их отправил. А потом сел ещё покрутить разные гравицапы этого пепелаца.

Сначала попробовал пропатчить саму строку на которой возникает ошибка. Но без знания кишков xpdf'а ничего серьёзного там сделать нельзя. Первый мой патч просто вырезал часть функции. xpdf стал работать стабильно, но в конце документов появлялись лишние хвосты.

Потом я задумался по поводу патчей. Не от них ли такие спецэффекты. Отключил патчи. Ноль эффекта. Включил патчи.

Тогда я задумался об опциях сборки. Начал крутить их и сверять с дефолтом xpdf'а. И в итоге обнаружил, что в дефолте xpdf'а

-DUSE_FIXEDPOINT=OFF
, а у Эрика Ширры:
-DUSE_FIXEDPOINT=ON
Переключил я этот рубильник в OFF, пересобираю, включаю - сегфолтов как не бывало.

Написал там на форуме о своём открытии. Разработчик xpdf'а мне там и говорит, что -DUSE_FIXEDPOINT вообще не надо юзать, что он для спецслучаев и недостаточно тестировался.

А потом я написал электронное письмо самому Эрику Ширре в котором сообщил о своём открытии. В итоге он свой пакет тоже пропатчил

%changelog
* Sun Feb 21 2021 ecsos <ecsos@opensuse.org>
...
- Set DUSE_FIXEDPOINT to OFF because it is only for specific
  situations and not heavily tested.
  And it can produce segmentation faults.
В общем, всё закончилось хорошо.

Ссылка на мой .src.rpm пакет: https://disk.yandex.ru/d/TLBlAuDUvU0r6A
Ссылка на пакет Эрика Ширры: https://download.opensuse.org/repositories/home:/ecsos/openSUSE_Leap_15.2/src...

★★★★★

Молодец. Но, как ни крути - это стандартный рабочий процесс. Скоро привыкнешь.

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

Какой дефолт? В openSUSE

официального пакета xpdf'а нет

А всё, что отсутствует в официальном репозитории, в openSUSE добывается через software.opensuse.org - поисковик по неофициальным пакетам. Я туда и пошёл и он мне и нашёл пакет от товарища по имени Eric Schirra. Ну и дальше по тексту.

Понятное дело, можно было пойти путём "./configure && make && make install", но он больше для source-based дистрибутивов подходит. Да и зачем если уже есть готовые .src.rpm пакеты, которые можно форкнуть?

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

А всё, что отсутствует в официальном репозитории

Можно собрать руками.

Понятное дело, можно было пойти путём «./configure && make && make install», но он больше для source-based дистрибутивов подходит.

Fail. Это только для помойки подходит. man checkinstall хотя бы.

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

Настоящие LFSоводы знают в своей системе каждый файл в лицо.

Я раньше долго юзал LFS без всяких пакетных менеджеров и checkinstall'ов, ибо это в том случае стрельба из пушки по воробьям. Там всё проще. Сначала устанавливаешь новые версии. Потом проходишь по ФС и удаляешь вручную уже ненужные остатки прошлых версий. И никаких проблем.

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

Преждевременная оптимизация во всей красе. Взял вот Эрик Ширр, и включил DUSE_FIXEDPOINT, а ведь хотел только хорошего.

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

В слаке всё так и собирается, только DESTDIR в последнем используется и всё это в пакет упаковывается.

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

знают в своей системе каждый файл в лицо.

Потом проходишь по ФС и удаляешь вручную уже ненужные остатки прошлых версий.

Ну это уже извращение какое-то.

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

Я знаю, и это единственный нормальный вариант - собирать в «песочницу» и делать пакет из неё.

zemidius
()

молодец. теперь добавь туда какую-нибудь фичу или на худой конец пофикси какой-нибудь баг

bender ★★★★★
()

Хороший рассказ. А я как-то собирал Qt5 под SLES 11. Обновил Glib2 до более новой версии, потому что QtWebkit не хотел собираться. Проходят годы, смотрю CUDA Toolkit, а там лежит среда разработки под него. И директория с библиотеками Qt5 обозвана, что ей надо минимум Glibc 2.11 и Glib 2.28. Хм... Версия Glibc намекает, что собирали не в RHEL/CentOS, а в SLES или Debian. А версия Glib намекает, что NVIDIA, возможно, воспользовалась моей сборкой (или скриптами сборки). Потому что я выбрал версию Glib рандомно (лишь бы новее, чем в релизе дистрибутива). А тут - та же самая версия используется.

ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 1)

Перечитал, что-то я вчера недобрый был, извиняюсь. За анализ и нахождение проблемного ключа - несомненный респект.

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

Еще лучше. Для того чтобы «осовременить» заиспользовали блоатваре.

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