2017-04-13 1 views
0

glibc malloc을 libc.so의 일부가 아닌 공유 라이브러리로 만들고 싶습니다.glibc malloc 만 공유 라이브러리로 빌드 할 수 있습니까?

저는 chroot를 사용하지 않고 직접 빌드하려고합니다. 당신이 볼 수 있듯이, malloc에이 -fPIC를 사용하여 구축됩니다

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

그래서 난 할 수 있어야한다 :

나는 정상적인 빌드로의 glibc을

, 그것은 즉 malloc을 구축하는 데 사용되는 명령을 출력 공유 라이브러리로 간단하게 링크 할 수 있습니다. 내가이 명령 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

을 실행할 때

그러나 나는이 오류가 나타 왜 relocation R_X86_64_PC32 against undefined symbol `__libc_multiple_threads' can not be used when making a shared object; recompile with -fPIC

내가 이해하지 못하는 오류가? 분명히 malloc.c를 컴파일했습니다 -fPIC

답변

1

왜이 오류가 나타나는지 이해가 가지 않습니다?

심볼은과 같이 인라인 어셈블리 통해 malloc.o 의해 참조된다 : 이와 같이

# 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:" 

, 그것은 R_X86_64_PC32 재배치 (외부 루틴 정상적인 통화 -fPIC 컴파일 때 R_X86_64_PLT32 재배치를 생성한다)를 생성한다. 이 어셈블리 형식은 심볼이 동일한 ELF 이미지에 정의되어 있다고 가정합니다.

일반 빌드에서이 기호는 숨겨진 기호 (즉, libc.so.6 안에 정의되어 있으며 내 보낸 것이 아님)가 nptl/libc_multiple_threads.c에 정의되어 있습니다. 당신이 하지libmalloc.solibc_multiple_threads.o에 연결하기 때문에

는 기호가 정의되지 않은 남아 있고, 링커는 제대로 불평이 기호는 (그 잘못된 재배치) 외부에서 올 수와 libmalloc.so 내부에 정의되어 있지 않습니다 .

단순히 libc_mutiple_threads.os에 연결하면 문제를 해결할 수 있다고 생각할 수도 있지만 잘못 될 수 있습니다. libmalloc.so은 실제로 있는지 여부에 관계없이 프로세스가 단일 스레드 인 것처럼 동작합니다.

TL : DR : 사고로 인한 것 외에는 우연히 만 작동합니다. 매우 여러 가지 방법으로 깨지기 쉬운입니다. 그 중 일부는 상당히 미묘 할 수 있습니다.

+0

감사합니다. 그것은 아주 명확한 설명이었습니다. 그래서 malloc을 쉽게 해킹 할 수있는 방법은 없습니다. 그래서? 또한 호기심에 대한 답변에서 게시 한'__libc_multiple_threads'에 대한 참조를 어떻게 추적 했습니까? – sha

+0

@sha 확실히 tmalloc이나 jemalloc을 사용하여'malloc.so'를 빌드 할 수 있습니다. 그러나 glibc의 일부를 분리하는 것은 효과가 없을 것입니다. –

관련 문제