2012年11月29日木曜日

firefoxでjavascriptの実行エラーを修理してみた

最近、firefoxでyoutubeを見てたらjsの実行エラーらしいダイアログBOXが出るようになって、まともに動画が見れなくなったので修理をしてみた。


gdbで何が起こったのか調べてみた
cuomo@poke ~ $ gdb /usr/bin/firefox 
GNU gdb (Gentoo 7.2 p1) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.gentoo.org/>...
Reading symbols from /usr/bin/firefox...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/firefox 
[Thread debugging using libthread_db enabled]
[New Thread 0x7fffe821b700 (LWP 27839)]
[New Thread 0x7fffe7816700 (LWP 27840)]
gdbを使ってfirefoxを起動しエラーが出るページへアクセスをするとgdbが以下のエラーを吐く
/usr/lib64/nspluginwrapper/i386/linux/npviewer.bin: error while loading shared libraries: libEGL.so.1: cannot open shared object file: No such file or directory
npviewer.binがlibEGL.so.1をロードできないらしいのでその辺を調べてみる

npviewer.binとlibEGL.so.1を調べてみた
エラーが出てるnpviewer.binはfileで調べて見たら32bit、でどのライブラリをリンクしているか調べてみる。
cuomo@poke ~ $ file /usr/lib64/nspluginwrapper/i386/linux/npviewer.bin
/usr/lib64/nspluginwrapper/i386/linux/npviewer.bin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

cuomo@poke ~ $ ldd -v /usr/lib64/nspluginwrapper/i386/linux/npviewer.bin
...
...
   libXfixes.so.3 => /usr/lib32/libXfixes.so.3 (0xf6e57000)
   libatk-1.0.so.0 => /usr/lib32/libatk-1.0.so.0 (0xf6e3a000)
   libcairo.so.2 => /usr/lib32/libcairo.so.2 (0xf6d4e000)
   libpixman-1.so.0 => /usr/lib32/libpixman-1.so.0 (0xf6ce2000)
   libEGL.so.1 => not found
   libXrender.so.1 => /usr/lib32/libXrender.so.1 (0xf6cd8000)
   libxcb.so.1 => /usr/lib32/libxcb.so.1 (0xf6cbd000)
   libXau.so.6 => /usr/lib32/libXau.so.6 (0xf6cb9000)
...
libEGL.so.1 => not foundでロードできてない様子。
とりあえず、/usr/lib32にあるlibEGL.so.1を読み込んでるらしいがどのパスから読み込んでるのかstraceで確認してみる。

straceでlibEGL.so.1の読み込み具合を確認
straceでどこのライブラリを読み込んでいるか確認してみる
cuomo@poke ~ $ straceでどこのライブラリを読み込んでいるか確認してみる
strace /usr/lib64/nspluginwrapper/i386/linux/npviewer.bin
mprotect(0xf6d8b000, 4096, PROT_NONE)   = 0
mmap2(0xf6d8c000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x67) = 0xfffffffff6d8c000
close(3)                                = 0
<span style="font-weight:bold;">open("/usr/lib32/libEGL.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)</span>
open("/lib32/tls/i686/sse2/libEGL.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
..
..
open("/usr/lib32/sse2/libEGL.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/usr/lib32/sse2", 0xffff5b0c)   = -1 ENOENT (No such file or directory)
open("/usr/lib32/libEGL.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/usr/lib32", {st_mode=S_IFDIR|0755, st_size=36864, ...}) = 0
writev(2, [{"/usr/lib64/nspluginwrapper/i386/"..., 50}, {": ", 2}, {"error while loading shared libra"..., 36}, {": ", 2}, {"libEGL.so.1", 11}, {": ", 2}, {"cannot open shared object file", 30}, {": ", 2}, {"No such file or directory", 25}, {"\n", 1}], 10/usr/lib64/nspluginwrapper/i386/linux/npviewer.bin: error while loading shared libraries: libEGL.so.1: cannot open shared object file: No such file or directory
) = 161
exit_group(127)   = ?
いろいろ読み込んだ挙句に無いと文句を言って終了してしまう。
open("/usr/lib32/libEGL.so.1", O_RDONLY) = -1 を読み込もうとしている。


ところでlibEGL.so.1ってなに?
libEGL.so.1の共有ライブラリのパッケージは何か調べてみると
poke ~ # equery b /usr/lib64/libEGL.so.1.0 
[ Searching for file(s) /usr/lib64/libEGL.so.1.0 in *... ]
media-libs/mesa-7.9.1 (/usr/lib64/libEGL.so.1.0)

mesaパッケージに含まれているので/usr/lib32にシンボリックリンクを張ってみた
poke ~ # ls -l /usr/lib32 | grep libEGL
lrwxrwxrwx 1 root root       11 Mar 20 10:30 libEGL.so -> libEGL.so.1
lrwxrwxrwx 1 root root       13 Mar 20 10:29 libEGL.so.1 -> libEGL.so.1.0
でもう一回straceで確認
cuomo@poke ~ $ ldd -v /usr/lib64/nspluginwrapper/i386/linux/npviewer.bin

open("/usr/lib32/libEGL.so.1", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2401\0\0\0\0\0\0"..., 512) = 512
close(3)                                = 0
stat64("/usr/lib32", {st_mode=S_IFDIR|0755, st_size=36864, ...}) = 0
writev(2, [{"/usr/lib64/nspluginwrapper/i386/"..., 50}, {": ", 2}, {"error while loading shared libra"..., 36}, {": ", 2}, {"libEGL.so.1", 11}, {": ", 2}, {"wrong ELF class: ELFCLASS64", 27}, {"", 0}, {"", 0}, {"\n", 1}], 10/usr/lib64/nspluginwrapper/i386/linux/npviewer.bin: error while loading shared libraries: libEGL.so.1: wrong ELF class: ELFCLASS64
) = 131
exit_group(127) = ?
ライブラリは読み込んだものの今度は、libEGL.so.1が64bitなのでダメだという
poke ~ # file /usr/lib64/libEGL.so.1.0
/usr/lib64/libEGL.so.1.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

media-libs/mesaのインストールでは/usr/lib64/libEGL.so.1.0の64bit版がインストールされてるみたいなので、32bitをとりあえず別の32bitのGentooなPCから持ってきて置いてみた。
poke lib32 # cd /usr/lib32/
poke lib32 # rm libEGL.so.1.0 <span style="font-weight:bold;"><--- 64bit/usr/lib64/libEGL.so.1.0へのシンボリックリンクを削除</span>
poke lib32 # ls -l | grep libEGL.so
lrwxrwxrwx 1 root root       11 Mar 20 10:30 libEGL.so -> libEGL.so.1
lrwxrwxrwx 1 root root       13 Mar 20 10:29 libEGL.so.1 -> libEGL.so.1.0
rwxr-xr-x 1 root root    62972 Mar 20 10:29 libEGL.so.1.0 <-- 新しく設置した32bit版のlibEGL.so.1.0

poke lib32 # file /usr/lib32/libEGL.so.1.0 
/usr/lib32/libEGL.so.1.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
新しく設置した32bit版のlibEGL.so.1.0
poke lib32 # file /usr/lib32/libEGL.so.1.0
/usr/lib32/libEGL.so.1.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
もう一度、/usr/lib64/nspluginwrapper/i386/linux/npviewer.binを実行してみる
cuomo@poke ~ $ /usr/lib64/nspluginwrapper/i386/linux/npviewer.bin
npviewer, NPAPI plugin viewer. Version 1.3.0

usage: /usr/lib64/nspluginwrapper/i386/linux/npviewer.bin [GTK flags] [flags]
  -h --help       print this message
  -t --test       check plugin is compatible
  -i --info       print plugin information
  -p --plugin     set plugin path
  -c --connection set connection path
動いたっぽいのでfirefoxでエラーの出たページを表示してみると治っているっぽい。

こんなのでいいのか?

とりあえず直してみたが、問題はmesaパッケージにあるのか分からない。
Gentooのbugzillaにも[http://bugs.gentoo.org/show_bug.cgi?id=354943:title=Bug 354943]であったが、どうやって修理すればいいのか?

とりあえず動いたからそのまま放置、時間が無いのであとで調べよう。
誰か、分かったら教えてください、よろしく。

0 件のコメント:

コメントを投稿