mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-14 21:10:19 +00:00
86bd05fbc8
The existing test avoided passing -mcmodel=large if the compiler didn't support it. However, we need to test not just the compiler support, but also the toolchain (as and ld) support, so make the test more complete. In addition, we have to avoid using the hwN_plt() assembly operators if that support is missing, so guard the uses with #ifdef NO_PLT_PCREL. This allows us to properly build glibc with the current community binutils, which doesn't yet have the PC-relative PLT operator support. The -mcmodel=large support is in gcc 4.8, but the toolchain support won't be present in the community until binutils 2.24.
36 lines
1.1 KiB
Makefile
36 lines
1.1 KiB
Makefile
include $(common-objpfx)cflags-mcmodel-large.mk
|
|
|
|
# Check for gcc to support the command-line switch, and for
|
|
# binutils to support the hwN_plt() assembly operators and relocations.
|
|
$(common-objpfx)cflags-mcmodel-large.mk: $(common-objpfx)config.make
|
|
mcmodel=no; \
|
|
(echo 'int main() { return getuid(); }' | \
|
|
$(CC) -o /dev/null -xc - -mcmodel=large -fpic) && mcmodel=yes; \
|
|
echo "cflags-mcmodel-large = $$mcmodel" > $@
|
|
|
|
ifeq (yes,$(cflags-mcmodel-large))
|
|
|
|
ifeq ($(subdir),csu)
|
|
# elf-init.c is in libc_nonshared.o (the end of the shared object) but
|
|
# must reach the _init symbol at the very start of the shared object.
|
|
CFLAGS-elf-init.c += -mcmodel=large
|
|
|
|
# __gmon_start__ is at the very start of the shared object when linked
|
|
# with profiling, but calls to libc.so via the PLT at the very end.
|
|
CFLAGS-gmon-start.c += -mcmodel=large
|
|
endif
|
|
|
|
else
|
|
|
|
# Don't try to compile assembly code with hwN_plt() directives if the
|
|
# toolchain doesn't support -mcmodel=large.
|
|
ifeq ($(subdir),csu)
|
|
CPPFLAGS-start.S += -DNO_PLT_PCREL
|
|
CPPFLAGS-crti.S += -DNO_PLT_PCREL
|
|
endif
|
|
ifeq ($(subdir),nptl)
|
|
CPPFLAGS-pt-crti.S += -DNO_PLT_PCREL
|
|
endif
|
|
|
|
endif
|