我可以只构建 glibc malloc 作为共享库吗?



我想将 glibc malloc 构建为共享库,而不是成为 libc.so 的一部分

我没有使用任何 chroot,而是直接尝试构建它。

当我将 glibc 作为普通构建时,它会输出用于构建 malloc 的命令,即:

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

如您所见,malloc 是使用-fPIC构建的,所以我应该能够简单地将其链接为共享库。

但是当我运行此命令时 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

我不明白为什么会出现此错误? 显然,我已经用-fPIC编译了malloc.c

我不明白为什么会出现此错误?

malloc.o通过内联程序集引用该符号,如下所示:

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

因此,它会生成R_X86_64_PC32重定位(使用-fPIC编译时,对外部例程的正常调用会生成R_X86_64_PLT32重定位)。这种组装形式假定符号将在同一ELF图像中定义。

在正常版本中,此符号被定义为nptl/libc_multiple_threads.c中的隐藏符号(意味着它在libc.so.6内部定义并且不会从中导出)。

由于您没有libc_multiple_threads.o链接到您的libmalloc.so,因此符号仍然未定义,并且链接器正确抱怨:此符号不能来自外部(错误的重新定位),并且未在您的libmalloc.so中定义。

您可能认为简单地链接libc_mutiple_threads.os就可以解决这个问题,但您错了:您的libmalloc.so的行为就像您的进程是单线程的,无论它是否实际上是单线程的。

TL;唐:你试图做的事情不太可能奏效,除非是偶然的。它很可能以多种方式被打破,其中一些可能非常微妙。

相关内容

  • 没有找到相关文章

最新更新