sabato 27 febbraio 2010

NERD POST: correggere i crash di Iceweasel con i video flash su Debian 64

Sono molto soddisfatto di aver migrato i miei computer con CPU AMD64 da Debian 32 bit a Debian 64 bit.
Checchè si pensi, per un uso desktop come io faccio, il codice compilato per AMD64 funziona in maniera più efficiente e facilita il lavoro.
L'unico problema che non ero ancora riuscito a risolvere era dovuto al fatto che sul mio portatile (ormai un po' vetusto) i filmati Flash mandavano in crash i browser (cosa che non succede sul desktop la cui CPU è di 1-2 anni successiva).
Oggi finalmente ho avuto un po' di tempo da dedicare al problema e ho trovato la soluzione a questo indirizzo:
http://www.hotplate.co.nz/?p=136

In sintesi pare che il Flash plugin per AMD 64 usi le istruzioni LAHF (non chiedetemi cosa siano :-D) che non sono supportate dai modelli più vecchi delle CPU AMD 64.
Pertanto è necessario compilare un plugin wrapper sviluppato da Maks Verver del gruppo che porta avanti la distro Gentoo (sì, avete ragione, l'ho fatto apposta a non scrivere la parola "comunità").

Qui sotto il codice nella sua interezza:


/* Simple work-around for running the 64-bit Adobe Flash plug-in version 10 on Athlon64 processors without support for the lahf instruction.


Compile with:
cc -fPIC -shared -nostdlib -lc -oflashplugin-lahf-fix.so flashplugin-lahf-fix.c
Then place the .so file in the plug-in directory (e.g. $HOME/.mozilla/plugins)
or use LD_PRELOAD to force Firefox to load the library.






- Maks Verver July 2009 */


#define _GNU_SOURCE
#include
#include
#include


static void sig_handler(int signal, siginfo_t *info, void *context) {
if (signal != SIGILL) return;
if (*(char*)info->si_addr != (char)0x9f) abort();
greg_t *regs = ((ucontext_t*)context)->uc_mcontext.gregs;
((char*)&regs[REG_RAX])[1] = ((char*)&regs[REG_EFL])[0];
regs[REG_RIP]++;
}


static struct sigaction old_sa, new_sa = {
.sa_flags = SA_SIGINFO,
.sa_sigaction = &sig_handler };


int _init() { sigaction(SIGILL, &new_sa, &old_sa); return 0; }
int _fini() { sigaction(SIGILL, &old_sa, &new_sa); return 0; }


Alla fine, come scritto peraltro nell'introduzione al codice, il tutto va compilato (previa installazione del pacchetto build-essential) con il comando:


cc -fPIC -shared -nostdlib -lc -oflashplugin-lahf-fix.so flashplugin-lahf-fix.c


Per concludere, basta copiare il file "flashplugin-lahf-fix.so" generato dalla compilazione all'interno della directory /usr/lib/mozilla/plugins/.

Da qui in poi non ci saranno più problemi.

Nessun commento:

Posta un commento