Esiste un modo open source per rendere statico un eseguibile dinamico senza disponibilità del codice sorgente?


20

Lasciami spiegare il problema con un esempio. Uso un vecchio programma nel mio lavoro quotidiano, come ad esempio xfig e pdfedit .

Ora, questi programmi sono piuttosto vecchi e non aggiornati troppo spesso; la mia paura è che un giorno o l'altro non funzionino più per mancanza di una libreria o di aggiornamenti incompatibili.

Se il programma è facile da compilare ora , su un sistema in esecuzione, la soluzione è utile: prova a hackerare un po 'il sorgente e compilarlo staticamente --- l'eseguibile risultante sarà grande e non così efficiente, ma funzionerà per il futuro prevedibile (1). Questo sembra essere il caso xfige lo proverò al più presto.

Ma, ad esempio, pdfeditdipende da Qt3 e la configurazione di un sistema per la compilazione è piuttosto complessa in questo momento. Fortunatamente può essere eseguito in questo momento, grazie al fatto che la libreria di cui ha bisogno non è in conflitto con nulla. Ma questo può cambiare in futuro, quindi vorrei risolvere questo problema:

Come posso creare un binario statico (o qualcosa di simile) se ne ho uno dinamico e tutte le librerie, ma nessun codice sorgente, su Ubuntu?

Ho cercato in giro. Una possibilità è statifier (2), ma ha molti problemi con la randomizzazione dell'indirizzo , quindi è un no-no. La versione non gratuita, Ermine , sembra funzionare, ma preferirei davvero un'opzione open source.

Un'altra possibilità è utilizzare la finestra mobile o un sistema di imballaggio simile. Ma tutti i tutorial che ho trovato sono piuttosto orientati a RedHat ; e, onestamente, abbastanza complesso da seguire.


Note a piè di pagina :

(1) non è così pazzo. Uso un ffmpeg statico, ad esempio, funziona bene e senza problemi di compatibilità ...

(2) per compilare statifier, consultare /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Risposte:


19

Puoi risolvere il tuo problema in un altro modo più semplice:

Utilizzare lddsul file eseguibile per visualizzare le librerie collegate, ad esempio:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Quindi raccogliere tutte le librerie in una cartella e impostare la variabile di ambiente LD_LIBRARY_PATH prima di eseguire il programma in modo che punti a questa cartella:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

In alternativa è possibile aggiungere una voce per la cartella lib a /etc/ld.so.conf.d/. Ma questo applicherebbe il cambiamento a livello di sistema.


Questa è una buona idea --- anche se mi piacerebbe davvero trovare un modo per impacchettare tutto questo in un eseguibile; questa soluzione può essere influenzata dai cambiamenti nel caricatore (anche se spero che nessuno lo farà in modo compatibile con le versioni precedenti). Assegnerà la taglia se non si presentano soluzioni migliori --- grazie.
Rmano,

Bene, potresti aggiungerlo a un piccolo script di installazione e collegarlo al percorso locale. Mi piace questa soluzione, avrei potuto usarla una volta.
WalyKu,

1
@Klaus, linux-vdso.so.1 non si vede da nessuna parte, suppongo sia nel kernel, giusto?
Rmano,

1
Sì. Da man 7 vdso: "Il" vDSO "(oggetto condiviso dinamico virtuale) è una piccola libreria condivisa che il kernel mappa automaticamente nello spazio degli indirizzi di tutte le applicazioni dello spazio utente."
Klaus D.

Sebbene questa non sia strettamente una risposta alla domanda, è una soluzione ragionevole. Grazie.
Rmano,

2

Un suggerimento per quanto riguarda lo statificatore :

Se la randomizzazione del layout dello spazio degli indirizzi (ASLR) sta causando un errore, non è necessario disattivarlo per l'intera macchina. Puoi disattivarlo solo per quel processo:

$ setarch `uname -m` -R statified_pdfedit [args...]

Eseguirà quel comando con il layout randomizzato disabilitato (non è necessario essere root).


Wow, interessante. Ora, se solo potessi compilare statifier...
Rmano,

Compilato e controllato. xfig_statifiedAncora core dump ... un peccato. Grazie comunque.
Rmano,

Sì, peccato. Mi chiedo se non si tratterebbe di un problema a 64 bit, forse provare a eseguire lo statificatore su una configurazione a 32 bit?
Lemonsqueeze,

Controllato su una macchina a 32 bit, core dump ancora.
Rmano,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.