From 9ef4e3afcb2e1d7c7a2e3aa77d02e802654d96da Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Thu, 13 Jan 2011 20:44:31 +0000 Subject: [PATCH] Apply a workaround for a binutils issue with the .note.ABI-tag section generated from lib/csu/common/crtbrand.c (which ultimately ends up in executables and shared libraries, via crt1.o, gcrt1.o or Scrt1.o). For all arches except sparc, gcc emits the section directive for the abitag struct in crtbrand.c with a PROGBITS type. However, newer versions of binutils (after 2.16.90) require the section to be of NOTE type, to guarantee that the .note.ABI-tag section correctly ends up in the first page of the final executable. Unfortunately, there is no clean way to tell gcc to use another section type, so crtbrand.c (or the C files that include it) must be compiled in multiple steps: - Compile the .c file to a .s file. - Edit the .s file to change the 'progbits' type to 'note', for the section directive that defines the .note.ABI-tag section. - Compile the .s file to an object file. These steps are done in the invididual Makefiles for each applicable arch. Reviewed by: kib --- lib/csu/amd64/Makefile | 27 +++++++++++++++++++++++---- lib/csu/arm/Makefile | 27 +++++++++++++++++++++++---- lib/csu/common/crtbrand.c | 17 +++++++++++++++++ lib/csu/i386-elf/Makefile | 27 +++++++++++++++++++++++---- lib/csu/ia64/Makefile | 28 ++++++++++++++++++++++------ lib/csu/mips/Makefile | 27 +++++++++++++++++++++++---- lib/csu/powerpc/Makefile | 27 +++++++++++++++++++++++---- lib/csu/powerpc64/Makefile | 19 +++++++++++++++++-- 8 files changed, 171 insertions(+), 28 deletions(-) diff --git a/lib/csu/amd64/Makefile b/lib/csu/amd64/Makefile index 1a74efcbcabe..aac0c64b51a4 100644 --- a/lib/csu/amd64/Makefile +++ b/lib/csu/amd64/Makefile @@ -12,12 +12,31 @@ CFLAGS+= -fno-omit-frame-pointer all: ${OBJS} CLEANFILES= ${OBJS} +CLEANFILES+= crt1.s gcrt1.s Scrt1.s -gcrt1.o: crt1.c - ${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.CURDIR}/crt1.c +# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not +# directly compiled to .o files. -Scrt1.o: crt1.c - ${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.CURDIR}/crt1.c +crt1.s: crt1.c + ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +crt1.o: crt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s + +gcrt1.s: crt1.c + ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +gcrt1.o: gcrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s + +Scrt1.s: crt1.c + ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +Scrt1.o: Scrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s realinstall: ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ diff --git a/lib/csu/arm/Makefile b/lib/csu/arm/Makefile index c0182847cd04..095a9ad14a68 100644 --- a/lib/csu/arm/Makefile +++ b/lib/csu/arm/Makefile @@ -11,12 +11,31 @@ CFLAGS+= -I${.CURDIR}/../common \ all: ${OBJS} CLEANFILES= ${OBJS} +CLEANFILES+= crt1.s gcrt1.s Scrt1.s -gcrt1.o: crt1.c - ${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC} +# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not +# directly compiled to .o files. -Scrt1.o: crt1.c - ${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC} +crt1.s: crt1.c + ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +crt1.o: crt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s + +gcrt1.s: crt1.c + ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +gcrt1.o: gcrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s + +Scrt1.s: crt1.c + ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +Scrt1.o: Scrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s realinstall: ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ diff --git a/lib/csu/common/crtbrand.c b/lib/csu/common/crtbrand.c index 684a48e9b64f..444d7f128729 100644 --- a/lib/csu/common/crtbrand.c +++ b/lib/csu/common/crtbrand.c @@ -36,6 +36,23 @@ __FBSDID("$FreeBSD$"); * Special ".note" entry specifying the ABI version. See * http://www.netbsd.org/Documentation/kernel/elf-notes.html * for more information. + * + * For all arches except sparc, gcc emits the section directive for the + * following struct with a PROGBITS type. However, newer versions of binutils + * (after 2.16.90) require the section to be of NOTE type, to guarantee that the + * .note.ABI-tag section correctly ends up in the first page of the final + * executable. + * + * Unfortunately, there is no clean way to tell gcc to use another section type, + * so this C file (or the C file that includes it) must be compiled in multiple + * steps: + * + * - Compile the .c file to a .s file. + * - Edit the .s file to change the 'progbits' type to 'note', for the section + * directive that defines the .note.ABI-tag section. + * - Compile the .s file to an object file. + * + * These steps are done in the invididual Makefiles for each applicable arch. */ static const struct { int32_t namesz; diff --git a/lib/csu/i386-elf/Makefile b/lib/csu/i386-elf/Makefile index b4d78c2297e7..b100d7a2bca2 100644 --- a/lib/csu/i386-elf/Makefile +++ b/lib/csu/i386-elf/Makefile @@ -11,19 +11,38 @@ FILESDIR= ${LIBDIR} CFLAGS+= -I${.CURDIR}/../common \ -I${.CURDIR}/../../libc/include CLEANFILES= ${FILES} crt1_c.o crt1_s.o gcrt1_c.o Scrt1_c.o +CLEANFILES+= crt1_c.s gcrt1_c.s Scrt1_c.s -gcrt1_c.o: crt1_c.c - ${CC} ${CFLAGS} -DGCRT -c -o gcrt1_c.o ${.CURDIR}/crt1_c.c +# See the comment in lib/csu/common/crtbrand.c for the reason crt1_c.c is not +# directly compiled to .o files. + +gcrt1_c.s: crt1_c.c + ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1_c.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +gcrt1_c.o: gcrt1_c.s + ${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1_c.s gcrt1.o: gcrt1_c.o crt1_s.o ${LD} ${LDFLAGS} -o gcrt1.o -r crt1_s.o gcrt1_c.o +crt1_c.s: crt1_c.c + ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1_c.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +crt1_c.o: crt1_c.s + ${CC} ${CFLAGS} -c -o ${.TARGET} crt1_c.s + crt1.o: crt1_c.o crt1_s.o ${LD} ${LDFLAGS} -o crt1.o -r crt1_s.o crt1_c.o objcopy --localize-symbol _start1 crt1.o -Scrt1_c.o: crt1_c.c - ${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1_c.o ${.CURDIR}/crt1_c.c +Scrt1_c.s: crt1_c.c + ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1_c.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +Scrt1_c.o: Scrt1_c.s + ${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1_c.s Scrt1.o: Scrt1_c.o crt1_s.o ${LD} ${LDFLAGS} -o Scrt1.o -r crt1_s.o Scrt1_c.o diff --git a/lib/csu/ia64/Makefile b/lib/csu/ia64/Makefile index 0aca844315e0..41d2b9cf8f46 100644 --- a/lib/csu/ia64/Makefile +++ b/lib/csu/ia64/Makefile @@ -11,12 +11,20 @@ all: ${OBJS} CLEANFILES= ${OBJS} CLEANFILES+= crt1_.o gcrt1_.o Scrt1_.o CLEANFILES+= crtbrand.o gcrtbrand.o Scrtbrand.o +CLEANFILES+= crtbrand.s gcrtbrand.s Scrtbrand.s crt1_.o: crt1.S ${CC} ${CFLAGS} -c -o ${.TARGET} ${.ALLSRC} -crtbrand.o: crtbrand.c - ${CC} ${CFLAGS} -c -o ${.TARGET} ${.ALLSRC} +# See the comment in lib/csu/common/crtbrand.c for the reason crtbrand.c is not +# directly compiled to .o files. + +crtbrand.s: crtbrand.c + ${CC} ${CFLAGS} -S -o ${.TARGET} ${.ALLSRC} + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +crtbrand.o: crtbrand.s + ${CC} ${CFLAGS} -c -o ${.TARGET} crtbrand.s crt1.o: crt1_.o crtbrand.o ${LD} ${LDFLAGS} -r -o ${.TARGET} crt1_.o crtbrand.o @@ -24,8 +32,12 @@ crt1.o: crt1_.o crtbrand.o gcrt1_.o: crt1.S ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.ALLSRC} -gcrtbrand.o: crtbrand.c - ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.ALLSRC} +gcrtbrand.s: crtbrand.c + ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.ALLSRC} + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +gcrtbrand.o: gcrtbrand.s + ${CC} ${CFLAGS} -c -o ${.TARGET} gcrtbrand.s gcrt1.o: gcrt1_.o gcrtbrand.o ${LD} ${LDFLAGS} -r -o ${.TARGET} ${.ALLSRC} @@ -33,8 +45,12 @@ gcrt1.o: gcrt1_.o gcrtbrand.o Scrt1_.o: crt1.S ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.ALLSRC} -Scrtbrand.o: crtbrand.c - ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.ALLSRC} +Scrtbrand.s: crtbrand.c + ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.ALLSRC} + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +Scrtbrand.o: Scrtbrand.s + ${CC} ${CFLAGS} -c -o ${.TARGET} Scrtbrand.s Scrt1.o: Scrt1_.o Scrtbrand.o ${LD} ${LDFLAGS} -r -o ${.TARGET} ${.ALLSRC} diff --git a/lib/csu/mips/Makefile b/lib/csu/mips/Makefile index c0182847cd04..095a9ad14a68 100644 --- a/lib/csu/mips/Makefile +++ b/lib/csu/mips/Makefile @@ -11,12 +11,31 @@ CFLAGS+= -I${.CURDIR}/../common \ all: ${OBJS} CLEANFILES= ${OBJS} +CLEANFILES+= crt1.s gcrt1.s Scrt1.s -gcrt1.o: crt1.c - ${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC} +# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not +# directly compiled to .o files. -Scrt1.o: crt1.c - ${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC} +crt1.s: crt1.c + ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +crt1.o: crt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s + +gcrt1.s: crt1.c + ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +gcrt1.o: gcrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s + +Scrt1.s: crt1.c + ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +Scrt1.o: Scrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s realinstall: ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ diff --git a/lib/csu/powerpc/Makefile b/lib/csu/powerpc/Makefile index c0182847cd04..095a9ad14a68 100644 --- a/lib/csu/powerpc/Makefile +++ b/lib/csu/powerpc/Makefile @@ -11,12 +11,31 @@ CFLAGS+= -I${.CURDIR}/../common \ all: ${OBJS} CLEANFILES= ${OBJS} +CLEANFILES+= crt1.s gcrt1.s Scrt1.s -gcrt1.o: crt1.c - ${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC} +# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not +# directly compiled to .o files. -Scrt1.o: crt1.c - ${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC} +crt1.s: crt1.c + ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +crt1.o: crt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s + +gcrt1.s: crt1.c + ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +gcrt1.o: gcrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s + +Scrt1.s: crt1.c + ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +Scrt1.o: Scrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s realinstall: ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ diff --git a/lib/csu/powerpc64/Makefile b/lib/csu/powerpc64/Makefile index 23954e840f36..04926adb8885 100644 --- a/lib/csu/powerpc64/Makefile +++ b/lib/csu/powerpc64/Makefile @@ -12,9 +12,24 @@ CFLAGS+= -Wall -Wno-unused \ all: ${OBJS} CLEANFILES= ${OBJS} +CLEANFILES+= crt1.s gcrt1.s -gcrt1.o: crt1.c - ${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC} +# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not +# directly compiled to .o files. + +crt1.s: crt1.c + ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +crt1.o: crt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s + +gcrt1.s: crt1.c + ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c + sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET} + +gcrt1.o: gcrt1.s + ${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s realinstall: ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \