This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: PR 445: A64 linker complains short data segment overflowed


On Wed, Oct 13, 2004 at 05:59:16PM -0700, James E Wilson wrote:
> On Wed, 2004-10-13 at 15:32, H. J. Lu wrote:
> > 	PR 445
> > 	* emulparams/elf64_ia64.sh (SMALL_DATA_CTOR): Set.
> > 	(SMALL_DATA_DTOR): Set
> > 	* scripttempl/elf.sc: If SMALL_DATA_CTOR is set, move .ctors
> > 	after .data. If SMALL_DATA_DTOR is set, move .dtors after .data.
> 
> The bug report doesn't clearly say what is wrong.  I had to look at
> binutils sources and gcc output to figure out what you were trying to
> say.  The problem here is that icc sets the SHF_IA_64_SHORT bit on the
> ctor/dtor sections, which it shouldn't, and this causes trouble for the
> gp calculation because ctor/dtor are now before the data section, and gp
> can't span the entire data section.
> 
> The readelf output is ambiguous here, as "p" simply means that some
> processor specific section header flag is set, and there is more than
> one of them.  The objdump output would have been more useful, as objdump
> will print SHORT_DATA when the SHF_IA_64_SHORT bit is set.
> 
> So icc needs to be fixed, but even if it is fixed, we probably need to
> accept libraries/object files compiled with old icc indefinitely, so the
> patch seems reasonable.
> 
> I think the patch does have one flaw though.  There is no comment
> explaining why we are doing this.  There should be a comment in the
> elf64_ia64.sh file saying this is necessary because some icc versions
> set the short data flag on ctor/dtor sections.  Even better if we can
> list the version number when it was fixed.  Otherwise, people looking at
> this in the future won't be able to understand why this weirdness is
> there.

I will try to get it fixed in the next icc.

> 
> The patch is OK with a comment added.
> 
> By the way, the FreeBSD elf64_ia64_fbsd.sh file includes elf64_ia64.sh. 
> If the Intel compiler does not and will not support FreeBSD, then
> perhaps we should clear SMALL_DATA_{CTOR,DTOR} in this file.  It isn't
> clear to me if this makes enough difference to matter though.

This is the patch I checked in.

Thanks.


H.J.
-----
2004-10-14  H.J. Lu  <hongjiu.lu@intel.com>

	PR 445
	* emulparams/elf64_ia64.sh (SMALL_DATA_CTOR): Set.
	(SMALL_DATA_DTOR): Set.
	* emulparams/elf64_ia64_fbsd.sh (SMALL_DATA_CTOR): Unset.
	(SMALL_DATA_DTOR): Unset.
	* scripttempl/elf.sc: If SMALL_DATA_CTOR is set, move .ctors
	after .data. If SMALL_DATA_DTOR is set, move .dtors after
	.data.

--- ld/emulparams/elf64_ia64.sh.small	2004-01-28 14:46:40.000000000 -0800
+++ ld/emulparams/elf64_ia64.sh	2004-10-14 09:54:20.862938477 -0700
@@ -33,3 +33,7 @@ test -n "$CREATE_PIE" && OTHER_GOT_RELOC
 OTHER_READONLY_SECTIONS="${OTHER_READONLY_SECTIONS}
   .IA_64.unwind_info ${RELOCATING-0} : { *(.IA_64.unwind_info${RELOCATING+* .gnu.linkonce.ia64unwi.*}) }
   .IA_64.unwind ${RELOCATING-0} : { *(.IA_64.unwind${RELOCATING+* .gnu.linkonce.ia64unw.*}) }"
+# Intel C++ compiler, prior to 9.0, puts small data in .ctors and
+# .dtors.  They have to be next to .sbss/.sbss2/.sdata/.sdata2.
+SMALL_DATA_CTOR=" "
+SMALL_DATA_DTOR=" "
--- ld/emulparams/elf64_ia64_fbsd.sh.small	2003-12-04 10:43:27.000000000 -0800
+++ ld/emulparams/elf64_ia64_fbsd.sh	2004-10-14 09:54:54.488591561 -0700
@@ -1,4 +1,6 @@
 . ${srcdir}/emulparams/elf64_ia64.sh
 TEXT_START_ADDR="0x2000000000000000"
 unset DATA_ADDR
+unset SMALL_DATA_CTOR
+unset SMALL_DATA_DTOR
 . ${srcdir}/emulparams/elf_fbsd.sh
--- ld/scripttempl/elf.sc.small	2004-10-04 10:29:49.000000000 -0700
+++ ld/scripttempl/elf.sc	2004-10-14 09:22:24.898622445 -0700
@@ -3,6 +3,8 @@
 #	NOP - four byte opcode for no-op (defaults to 0)
 #	NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not
 #		empty.
+#	SMALL_DATA_CTOR - .ctors contains small data.
+#	SMALL_DATA_DTOR - .dtors contains small data.
 #	DATA_ADDR - if end-of-text-plus-one-page isn't right for data start
 #	INITIAL_READONLY_SECTIONS - at start of text segment
 #	OTHER_READONLY_SECTIONS - other than .text .init .rodata ...
@@ -347,8 +349,8 @@ cat <<EOF
   .fini_array   ${RELOCATING-0} : { KEEP (*(.fini_array)) }
   ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}}
 
-  ${RELOCATING+${CTOR}}
-  ${RELOCATING+${DTOR}}
+  ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
+  ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}
   .jcr          ${RELOCATING-0} : { KEEP (*(.jcr)) }
 
   ${RELOCATING+${DATARELRO}}
@@ -372,6 +374,8 @@ cat <<EOF
   .data1        ${RELOCATING-0} : { *(.data1) }
   ${WRITABLE_RODATA+${RODATA}}
   ${OTHER_READWRITE_SECTIONS}
+  ${SMALL_DATA_CTOR+${RELOCATING+${CTOR}}}
+  ${SMALL_DATA_DTOR+${RELOCATING+${DTOR}}}
   ${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}
   ${RELOCATING+${OTHER_GOT_SYMBOLS}}
   ${NO_SMALL_DATA-${GOT}}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]