我可以只构建 glibc malloc 作为共享库吗?
Can I build only glibc malloc as a shared library?
我想将 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
构建的,所以我应该能够简单地 link 它作为共享库。
然而当我运行这个命令
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
I don't understand why this error shows up?
该符号由 malloc.o
通过内联汇编引用,如下所示:
# 69 "../sysdeps/unix/sysv/linux/x86_64/lowlevellock.h"
#define __lll_trylock_asm "cmpl [=10=], __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
图像中定义。
在正常构建中,此符号在 nptl/libc_multiple_threads.c
.
中被定义为隐藏符号(意味着它在 libc.so.6
中定义并且不从中导出)
由于您 没有 将 libc_multiple_threads.o
链接到您的 libmalloc.so
,该符号仍未定义,并且链接器正确地抱怨:这个符号不能来自外部(为此错误的搬迁)并且未在您的 libmalloc.so
.
中定义
您可能认为简单地在 libc_mutiple_threads.os
中链接就可以解决这个问题,但您错了:您的 libmalloc.so
的行为就像您的进程是单线程的,不管它实际上是否是不是。
TL;DR:除非偶然,否则您尝试做的事情不太可能奏效。它非常 可能以多种方式被破坏,其中一些可能非常微妙。
我想将 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
构建的,所以我应该能够简单地 link 它作为共享库。
然而当我运行这个命令
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
I don't understand why this error shows up?
该符号由 malloc.o
通过内联汇编引用,如下所示:
# 69 "../sysdeps/unix/sysv/linux/x86_64/lowlevellock.h"
#define __lll_trylock_asm "cmpl [=10=], __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
图像中定义。
在正常构建中,此符号在 nptl/libc_multiple_threads.c
.
libc.so.6
中定义并且不从中导出)
由于您 没有 将 libc_multiple_threads.o
链接到您的 libmalloc.so
,该符号仍未定义,并且链接器正确地抱怨:这个符号不能来自外部(为此错误的搬迁)并且未在您的 libmalloc.so
.
您可能认为简单地在 libc_mutiple_threads.os
中链接就可以解决这个问题,但您错了:您的 libmalloc.so
的行为就像您的进程是单线程的,不管它实际上是否是不是。
TL;DR:除非偶然,否则您尝试做的事情不太可能奏效。它非常 可能以多种方式被破坏,其中一些可能非常微妙。