LINUX.ORG.RU

Не компилируется Firefox (ассемблерный код)

 ,


0

3

Дополнено: проблема решена, вот бинари для Debian 5 backports (на другом линуксе тоже работает, пробовал в Gentoo):

firefox-37.0.2.tar.xz
firefox-38.0.1esr.tar.xz

Исходное сообщение:

Пилю чисто для себя репо для старого линукса (Opensuse 11.4 и Debian 5), в который входят свежее ядро, Glibc, GCC и графический стек. Потому что мне очень симпатичен старый Linux, но там не работает новый софт.

Начал собирать Firefox 37.0.2. Скопировал .mozconfig из SRPM для CentOS 5 и наложил некоторые патчи (например бэкпорт для старого Pango). В процессе компиляции - ошибка:

make[5]: Entering directory `/1/zenitur/firefox/mozilla-release/objdir/gfx/skia'
mkdir -p '.deps/'
SkBlitRow_opts_SSE4_asm.o
gcc -o SkBlitRow_opts_SSE4_asm.o -fPIC -Wa,--noexecstack -include ../../mozilla-config.h -DMOZILLA_CLIENT  -g   -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/config -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/core -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/effects -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/gpu -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/images -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/pathops -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/pipe -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/ports -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/utils -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/utils/mac -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/utils/win -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/include/views -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/core -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/gpu -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/gpu/effects -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/gpu/gl -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/image -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/lazy -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/sfnt -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/utils -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/utils/mac -I/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/utils/win  -c /1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S
SkAdvancedTypefaceMetrics.o
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S: Assembler messages:
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:119: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:147: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:199: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:240: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:304: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:329: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:365: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:402: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:427: Error: suffix or operands invalid for `pblendvb'
/1/zenitur/firefox/mozilla-release/gfx/skia/trunk/src/opts/SkBlitRow_opts_SSE4_asm.S:463: Error: suffix or operands invalid for `pblendvb'
make[5]: *** [SkBlitRow_opts_SSE4_asm.o] Error 1
make[5]: Leaving directory `/1/zenitur/firefox/mozilla-release/objdir/gfx/skia'
make[4]: *** [gfx/skia/target] Error 2

В процессе поиска ошибки в Google я нашёл такую же в KDE: https://bugs.kde.org/show_bug.cgi?id=271438 Причём там прямым текстом упоминается Debian 5:

Anybody has objections to applying the patch?

Without your patch, regtest fail to compile on debian5.
With your patch, it is ok.
So, looks ok to me.
Thanks

Собственно патч:

===================================================================
 --- configure.in (revision 12325)
 +++ configure.in (working copy) @@
 -1551,7 +1551,9 @@
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
 	do { long long int x;
 	__asm__ __volatile__(
 - 	"crc32q %%r15,%%r15" : : : "r15" ); } 
+ 	"crc32q %%r15,%%r15" : : : "r15" ); 
+ 	__asm__ __volatile__( 
+ 	"pblendvb (%rcx), %xmm11"); } 
 while (0) 
]])], [
 ac_have_as_sse42=yes 

Как его применить к Firefox? Больше поиском я не нашёл в точности такую же ошибку! Попробовал дописать в .mozconfig ac_add_options --enable-optimize="-march=i686" - не помогло.

★★★★★

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

Как его применить к Firefox?

найти места, где оно используется и поменять вручную? Патч то небольшой.

anonymous
()

buddhist, GCC 4.6.4, yasm 1.1.0 (установил как зависимость для сборки. Он, скорее всего, нужен для Firefox+libjpeg-turbo, а не для самого Firefox).

anonymous, я ассемблер не знаю :-( Поиском по файлу нашёл те 10 мест, на которые указал компилятор.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Я потом выложу на Главную ЛОР-а ссылки на реп и готовую сборку ISO. Возможно, перенесут в Talks. В настоящий момент ещё не готово - из 200 иксовых компонентов я собрал только 60 основных, необходимых для моей видеокарты. И сделал это не DEB-ами, а скриптом в юзерспейс. Так что ещё работать и работать.

Вот пакеты с ядром для i686!

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

Ну так ты расшарь куда-то. Может я тебе каких-нить пулл-реквестов пришлю или кто-то другой. Да и отслеживать было бы интересно что ты там попиливаешь.

deep-purple ★★★★★
()

Я так понял, в configure.in патчится тест, после неуспешного прохождения которого sse42 отключается и SkBlitRow_opts_SSE4_asm.S не собирается.

Собственно берёшь чистую директорию с сорцами, патчишь этот configure.in, конфигурируешь и компилируешь заново Firefox без SkBlitRow_opts_SSE4_asm.S.

EXL ★★★★★
()

Похоже, что у тебя слишком старые binutils. Обнови и будет тебе счастье

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

Куда воткнуть?

А что, в описании патча не указано куда воткнуть? Я то только про плюсики.

deep-purple ★★★★★
()
Ответ на: комментарий от ZenitharChampion

Он, скорее всего, нужен для Firefox+libjpeg-turbo, а не для самого Firefox

В твоем логе обсирается gas, а не yasm

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

> Я так понял, в configure.in патчится тест, после неуспешного прохождения которого sse42 отключается и SkBlitRow_opts_SSE4_asm.S не собирается.

Вот оно что... Попробовал:

--- configure.in~       2015-04-15 21:18:44.000000000 +0000
+++ configure.in        2015-04-25 18:26:57.375209162 +0000
@@ -1400,7 +1400,7 @@
     _SAVE_CFLAGS=$CFLAGS
     CFLAGS="$CFLAGS -mssse3"
     AC_TRY_COMPILE([asm ("pmaddubsw %xmm2,%xmm3");],,AC_MSG_RESULT([yes])
-                     [HAVE_TOOLCHAIN_SUPPORT_MSSSE3=1],
+                     [HAVE_TOOLCHAIN_SUPPORT_MSSSE3=0],
                      AC_MSG_RESULT([no]))
     CFLAGS=$_SAVE_CFLAGS

@@ -1410,7 +1410,7 @@
     _SAVE_CFLAGS=$CFLAGS
     CFLAGS="$CFLAGS -msse4.1"
     AC_TRY_COMPILE([asm ("pmulld %xmm6,%xmm0");],,AC_MSG_RESULT([yes])
-                     [HAVE_TOOLCHAIN_SUPPORT_MSSE4_1=1],
+                     [HAVE_TOOLCHAIN_SUPPORT_MSSE4_1=0],
                      AC_MSG_RESULT([no]))
     CFLAGS=$_SAVE_CFLAGS

@@ -1422,7 +1422,7 @@
                      result="yes", result="no")
       AC_MSG_RESULT("$result")
       if test "$result" = "yes"; then
-          HAVE_X86_AVX2=1
+          HAVE_X86_AVX2=0
       fi
     esac

Дальше autoconf2.13, и собрать заново. Ошибка та же. У тебя есть версии о том, как ещё можно запретить сборку с SSE4?

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

CFLAGS=«$CFLAGS -msse4.1»

А вообще без этих sseN флагов если?

deep-purple ★★★★★
()
Ответ на: комментарий от ZenitharChampion

У тебя есть версии о том, как ещё можно запретить сборку с SSE4?

Возможно на 3rdparty skia это не распространяется. Тут ковыряться пробовал?

https://github.com/mozilla/gecko-dev/blob/master/gfx/skia/moz.build#L873

if CONFIG['INTEL_ARCHITECTURE'] and CONFIG['GNU_CC'] and CONFIG['OS_ARCH'] != 'WINNT':
    if CONFIG['CPU_ARCH'] == 'x86_64':
        SOURCES += [
            'trunk/src/opts/SkBlitRow_opts_SSE4_x64_asm.S',
        ]
    else:
        SOURCES += [
            'trunk/src/opts/SkBlitRow_opts_SSE4_asm.S',
        ]
EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

Пилю чисто для себя репо для старого линукса (Opensuse 11.4 и Debian 5), в который входят свежее ядро, Glibc, GCC и графический стек. Потому что мне очень симпатичен старый Linux, но там не работает новый софт.

дальше не читал.

emulek
()
Ответ на: комментарий от deep-purple

Но это не ответ на вопрос где поватчить за движениями зенитара.

я не вижу смысла в этом. Ну у них должен быть Changelog на сайте.

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

От блин, а!

In file included from /1/zenitur/firefox/mozilla-release/objdir/gfx/layers/Unified_cpp_gfx_layers2.cpp:2:0:
/1/zenitur/firefox/mozilla-release/gfx/layers/basic/BasicCompositor.cpp:20:56: fatal error: skia/SkCanvas.h: No such file or directory
compilation terminated.
make[5]: *** [Unified_cpp_gfx_layers2.o] Error 1
make[4]: *** [gfx/layers/target] Error 2

Я не знаю что это и зачем это не нужно, но Firefox офигел от его отсутствия. Похоже, ты прав, и действительно придётся править generate_mozbuild.py.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Меня вообще-то дебианчик интересует. Так в моем посте и написано.

на их сайте был? должно быть.

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

Классический гуглокод

На http://www.craftymind.com/factory/guimark2/HTML5ChartingTest.html Skia в два раза (20 fps) быстрее Cairo (8 fps). Правда вариант на Flash ценой в 300% CPU выдаёт 60 fps. Наверное, если бы не ограничение в 60 fps во флешке, он бы всё сожрал.

i-rinat ★★★★★
()
Ответ на: комментарий от buddhist

Ты возмущаешься фрагментации? Корпорации бобра? Просто для галочки?

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

В самом конце, когда уже создались libxul.so и libnss.so, появилась эта ошибка:

js/src/jit/CodeGenerator.cpp:1309: error: undefined reference to 'JSFatInlineString::MAX_LENGTH_LATIN1'
js/src/jit/CodeGenerator.cpp:1309: error: undefined reference to 'JSFatInlineString::MAX_LENGTH_TWO_BYTE'
js/src/jit/CodeGenerator.cpp:1309: error: undefined reference to 'JSInlineString::MAX_LENGTH_LATIN1'
js/src/jit/CodeGenerator.cpp:1309: error: undefined reference to 'JSInlineString::MAX_LENGTH_TWO_BYTE'

Я нашёл этот баг: Bug 1081180 - Build error: CodeGenerator.cpp:1309: error: undefined reference to 'JSInlineString::MAX_LENGTH_TWO_BYTE'. Пошёл накладывать патч - и увидел что он уже наложен. В чём же дело? Поиск привёл меня к багу Bug 1121481 - Error compiling jit/CodeGenerator.cpp with gcc 4.6.4 Взял патч, наложил, и получил другую ошибку:

/1/zenitur/firefox/mozilla-release/js/src/jit/CodeGenerator.cpp:5416:31: error: ‘JSThinInlineString’ has not been declared
/1/zenitur/firefox/mozilla-release/js/src/jit/CodeGenerator.cpp:5418:31: error: ‘JSThinInlineString’ has not been declared
/1/zenitur/firefox/mozilla-release/js/src/jit/CodeGenerator.cpp:5421:50: error: ‘maxLengthInline’ was not declared in this scope

А вот она уже не гуглится ни в какую. Похоже, придётся писать в багзиллу.

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

А вот она уже не гуглится ни в какую.

grep'ни дерево исходников на предмет «class JSInlineString» и подцепи нужный хедер в CodeGenerator.cpp

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

Я решил попробовать 38.0b7 иии...

configure: error: Only GCC 4.7 or newer supported
ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от EXL

Нашёл где накосячил. Патч linker.patch - не для моей версии Firefox. Пришлось кое-что поменять руками. http://i.imgur.com/obO0HWL.png Отправил пересобирать, сначала, по-хардкору. :-(

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

Скомпилировалось! Патч на --disable-skia помог. Спасибо тебе!

Ещё понадобился второй патч, исправляющий сборку в GCC 4.6.4. И так как найти его сходу - проблема, и для последнего релиза Firefox 37.0.2 его нужно править, я запосщу его сюда (и чуть позже - на страницу бага):

--- js/src/jit/CodeGenerator.cpp~	2015-04-15 21:18:45.000000000 +0000
+++ js/src/jit/CodeGenerator.cpp	2015-04-25 22:12:01.335057389 +0000
@@ -5411,9 +5411,12 @@
     masm.branchIfRope(rhs, failure);
 
     // Allocate a JSInlineString or JSFatInlineString.
-    size_t maxLengthInline = isTwoByte
-                             ? JSInlineString::MAX_LENGTH_TWO_BYTE
-                             : JSInlineString::MAX_LENGTH_LATIN1;
+    size_t maxLengthInline;
+    if (isTwoByte)
+        maxLengthInline = JSInlineString::MAX_LENGTH_TWO_BYTE;
+    else
+        maxLengthInline = JSInlineString::MAX_LENGTH_LATIN1;
+
     Label isFat, allocDone;
     masm.branch32(Assembler::Above, temp2, Imm32(maxLengthInline), &isFat);
     {

И, наконец, сама сборка (tar.xz, 40 Мб). На чистом Debian 5 не работает, так как очень специфичная конфигурация: нужен новый libstdc++.so.6 версии GLIBCXX_3.4.14, а также GTK и Cairo из backports. И я забыл отвязать от нового pango, так что нужен ещё и он. И вообще вряд ли у кого-нибудь запустится, кроме меня, но вдруг кому-нибудь пригодится!

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

GCC 4.6.4

I saw this issue before. GCC has some problem with ternary operator and consts. This doesn't link properly.

И это стабильная ветка. Жесть. Просто жесть.

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

Вышел Firefox 38.0.1esr, решил собрать его. Отключил параметр --enable-safe-browsing, потому что с ним страничка иногда вставала на Stop вместо начала загрузки, а Firefox писал в консоль:

WARNING: content window passed to PrivateBrowsingUtils.isWindowPrivate. Use isContentWindowPrivate instead (but only for frame scripts).
pbu_isWindowPrivate@resource://gre/modules/PrivateBrowsingUtils.jsm:25:14
nsBrowserAccess.prototype.openURI@chrome://browser/content/browser.js:14291:25

Без Skia было печально: весь Web 2.0 тормозил, например на «главной» сайта знакомств mamba.ru есть падающие сверху вниз фотографии девушек. С Cairo это ооочень медленно! Со Skia - не тормозит.

Случайно нарёл решение проблемы со Skia, набрав в Google «firefox configure disable toolchain supports msse4.1 option». Вот баг, вот патч. Пересобрал по той же ссылке, но на всякий случай продублирую в «шапке». Вложил C++ Runtime - при этом сократил размер архива на 5 мб. Теперь запускается на всех системах 2008 года и новее! Нужен только GTK 2.18 (или новее) - в Debian 5 он очень удачно лежит в Backports.

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

Это же просто отлично! В этом 320-мегабайтном архиве есть патч build-gtk2-2.10.patch. Это просто супер :-)

Заодно заметил баг в версии 38.0.1. Он не скачивает файлы! Сохраняю файлы с исходниками с http://packages.debian.org/, а они занимают 0 байт. В 37.x такого не было. Я не уверен, это только в старом дистрибутиве, или и в новых тоже. Потестируй? https://packages.debian.org/jessie/pidgin Справа страницы.

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

У меня пока 37.0.2 и нет возможности обновиться. Там всё нормально со скачиванием.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
5 августа 2015 г.

Дополнено: проблема решена, вот бинари для Debian 5 backports

Под LSB задолбался чтоль?

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

кстати да, начитался тут, что современный ff летает, поставил и поюзал обычный и девелоперский ff, потом заново запустил хромиум и немного офигел как он летает

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

И это стабильная ветка

именно. я бы даже сказал ключевой момент

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