2010-04-28 14 views
6

Desidero fornire le librerie condivise insieme al mio programma piuttosto che utilizzare il sistema di destinazione a causa delle differenze di versione.Come collegarsi a un diverso file libc?

ldd dice il mio programma utilizza queste librerie condivise:

linux-gate.so.1 => (0xf7ef0000)**(made by kernel)** 
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)** 
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)** 

Ho collegato con successo ld-xxx.so dalla compilazione con:

gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c 

Ma io non sono riusciti a collegamento successo libc-xxx.so. Come lo posso fare ?

+1

Si può prendere in considerazione in modo statico che collega il vostro programma se si dispone di un solo eseguibile. In questo modo nessuno perderà accidentalmente la tua versione di libc e se rimuovono il tuo programma non lasceranno la tua libc indugiare. – nategoose

+0

Stesso ma statico: http://stackoverflow.com/questions/10763394/how-to-build-a-c-program-using-a-custom-version-of-glibc –

risposta

7

ho scoperto come si fa:

rpath specifica dove si trovano le librerie fornite. Questa cartella deve contenere: libc.so.6, libdl.so.2, libgcc_s.so.1 e forse più. Controllare con strace per scoprire quali librerie utilizza il file binario.

ld.so è il linker fornito

gcc -Xlinker -rpath=/default/path/to/libraries -Xlinker -I/default/path/to/libraries/ld.so program.c

6

Passando a -nodefaultlibs o -nostdlib in gcc, gli diremo di non passare le librerie predefinite come argomenti a ld. Sarai quindi in grado di specificare esplicitamente la libc a cui vuoi collegarti. Vedere la pagina man gcc(1) per ulteriori dettagli e avvertimenti relativi a entrambe le opzioni.

+2

Nota questo post è errato. Non è necessario passare nessuna di quelle 2 bandiere. –