2017-04-13 4 views
0

Je veux construire glibc malloc comme une bibliothèque partagée au lieu de faire partie de libc.soPuis-je créer uniquement glibc malloc en tant que bibliothèque partagée?

Je n'utilise pas de chroot mais j'essaie directement de le construire.

Quand je fais glibc comme une construction normale, il émet la commande qui est utilisé pour construire malloc savoir:

gcc malloc.c -c -std=gnu99 -fgnu89-inline -O2 -Wall -Winline -Wundef -Wwrite-strings -fmerge-all-constants -frounding-math -g -Wstrict-prototypes -fPIC -DMORECORE_CLEARS=2 -I../include -I/home/sharath.g/glibc-2.20/build/malloc -I/home/sharath.g/glibc-2.20/build -I../sysdeps/unix/sysv/linux/x86_64/64 -I../sysdeps/unix/sysv/linux/x86_64 -I../sysdeps/unix/sysv/linux/x86 -I../sysdeps/unix/sysv/linux/wordsize-64 -I../sysdeps/x86_64/nptl -I../sysdeps/unix/sysv/linux -I../sysdeps/nptl -I../sysdeps/pthread -I../sysdeps/gnu -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/x86_64 -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/x86_64/64 -I../sysdeps/x86_64/fpu/multiarch -I../sysdeps/x86_64/fpu -I../sysdeps/x86/fpu -I../sysdeps/x86_64/multiarch -I../sysdeps/x86_64 -I../sysdeps/x86 -I../sysdeps/ieee754/ldbl-96 -I../sysdeps/ieee754/dbl-64/wordsize-64 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 -I../sysdeps/wordsize-64 -I../sysdeps/ieee754 -I../sysdeps/generic -I.. -I../libio -I. -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DPIC -DSHARED -o /home/sharath.g/glibc-2.20/build/malloc/malloc.o -MD -MP -MF /home/sharath.g/glibc-2.20/build/malloc/malloc.os.dt -MT /home/sharath.g/glibc-2.20/build/malloc/malloc.os

Comme vous pouvez le voir, malloc est construit en utilisant -fPIC donc je devrais pouvoir simplement le lier comme une bibliothèque partagée.

Cependant quand je lance cette commande gcc -shared -Wl,-soname,libmalloc.so -shared -lpthread -lm -lrt -o /home/sharath.g/glibc-2.20/build/malloc/libmalloc.so /home/sharath.g/glibc-2.20/build/malloc/malloc.o

Je reçois une erreur relocation R_X86_64_PC32 against undefined symbol `__libc_multiple_threads' can not be used when making a shared object; recompile with -fPIC

Je ne comprends pas pourquoi cette erreur apparaît? clairement j'ai compilé malloc.c avec -fPIC

Répondre

1

Je ne comprends pas pourquoi cette erreur apparaît?

Le symbole est référencé par malloc.o par assemblage en ligne, comme ceci:

# 69 "../sysdeps/unix/sysv/linux/x86_64/lowlevellock.h" 
#define __lll_trylock_asm "cmpl $0, __libc_multiple_threads(%%rip)\n\t" "je 0f\n\t" "lock; cmpxchgl %2, %1\n\t" "jmp 1f\n\t" "0:\tcmpxchgl %2, %1\n\t" "1:" 

En tant que tel, il génère la relocalisation R_X86_64_PC32 (appels normaux aux routines externes générer R_X86_64_PLT32 délocalisations lorsqu'il est compilé avec -fPIC). Cette forme d'assemblage suppose que le symbole sera défini dans la même image ELF.

Dans la construction normale, ce symbole est défini comme un symbole caché (c'est-à-dire qu'il est défini à libc.so.6 et n'est pas exporté) dans nptl/libc_multiple_threads.c.

Puisque vous êtes pas liant à libc_multiple_threads.o dans votre libmalloc.so, le symbole reste indéfini, et l'éditeur de liens se plaint correctement: ce symbole ne peut pas venir de l'extérieur (la mauvaise relocalisation pour cela) et n'est pas définie à l'intérieur de votre libmalloc.so .

Vous pourriez penser que simplement lier dans libc_mutiple_threads.os résoudrait cela, mais vous aurez tort: ​​votre libmalloc.so se comporterait comme si votre processus est monothread, qu'il soit ou non.

TL; DR: ce que vous essayez de faire est peu susceptible de fonctionner, sauf par accident. Il est très susceptibles d'être cassés de plusieurs façons, dont certaines pourraient être assez subtiles.

+0

Merci. C'était une explication très claire. Il n'y a donc pas de moyen facile de pirater un malloc.so? Aussi par curiosité, comment avez-vous retrouvé la référence à '__libc_multiple_threads' que vous avez posté dans la réponse? – sha

+0

@sha Vous pouvez certainement construire 'malloc.so' en utilisant tcmalloc ou jemalloc. Mais séparer des parties de la glibc n'est pas susceptible de fonctionner. –