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]

PATCH: Fix -Ttext and friends for ELF systems


For a long time, -Ttext, -Tdata, and -Tbss have been useless (or
broken, depending on how you look at it) on ELF systems.  Rather than
setting the segment base address, these options set the address of a
particular section.  That tended to result in the linker putting that
section outside the relevant segment, without moving the rest of the
contents of the segment, and then issuing none-too-helpful errors
like:

  Not enough room for program headers (allocated 3, need 4)

This is a proto-patch that fixes this problem for ARM BPABI.  The key
idea is that, rather than setting the section address directly, these
options define symbols like "__text_segment_start".  Then, the linker
script uses the value of these symbols to set the location counter at
the start of particular segments.  The linker script also marks these
symbols as local so that they do not actually show up in the generated
executable or shared object.

What do people think of this approach?  My biggest concern so far is
that I've probably broken these options on non-ELF systems due to the
change in lexsup.c which no longer sets the section address.  I don't
know how to check whether I'm on an ELF section at runtime in the
linker.  I suppose that I could add a hook in the non-ELF *.em files;
would that make the most sense?  (I'm not worried about breaking these
options on ELF systems, since they are already broken.)

--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/ld/Makefile.in,v
retrieving revision 1.173
diff -c -5 -p -r1.173 Makefile.in
*** Makefile.in	8 Oct 2004 00:22:13 -0000	1.173
--- Makefile.in	23 Oct 2004 01:03:49 -0000
*************** earm_epoc_pe.c: $(srcdir)/emulparams/arm
*** 1274,1284 ****
  earmpe.c: $(srcdir)/emulparams/armpe.sh \
    $(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
  	${GENSCRIPTS} armpe "$(tdir_armpe)"
  earmsymbian.c: $(srcdir)/emulparams/armsymbian.sh \
    $(srcdir)/emulparams/armelf.sh $(srcdir)/emultempl/elf32.em \
!   $(srcdir)/emultempl/armelf.em $(srcdir)/scripttempl/elf.sc \
    ${GEN_DEPENDS}
  	${GENSCRIPTS} armsymbian "$(tdir_armelf)"
  eavr2.c: $(srcdir)/emulparams/avr2.sh \
    $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
    ${GEN_DEPENDS}
--- 1274,1284 ----
  earmpe.c: $(srcdir)/emulparams/armpe.sh \
    $(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
  	${GENSCRIPTS} armpe "$(tdir_armpe)"
  earmsymbian.c: $(srcdir)/emulparams/armsymbian.sh \
    $(srcdir)/emulparams/armelf.sh $(srcdir)/emultempl/elf32.em \
!   $(srcdir)/emultempl/armelf.em $(srcdir)/scripttempl/armbpabi.sc \
    ${GEN_DEPENDS}
  	${GENSCRIPTS} armsymbian "$(tdir_armelf)"
  eavr2.c: $(srcdir)/emulparams/avr2.sh \
    $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \
    ${GEN_DEPENDS}
Index: lexsup.c
===================================================================
RCS file: /cvs/src/src/ld/lexsup.c,v
retrieving revision 1.78
diff -c -5 -p -r1.78 lexsup.c
*** lexsup.c	7 Oct 2004 14:45:22 -0000	1.78
--- lexsup.c	23 Oct 2004 01:03:50 -0000
***************
*** 53,62 ****
--- 53,63 ----
  #define	S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
  #endif
  
  static void set_default_dirlist (char *);
  static void set_section_start (char *, char *);
+ static void set_symbol (char *, char *);
  static void help (void);
  
  /* Non-zero if we are processing a --defsym from the command line.  */
  int parsing_defsym = 0;
  
*************** parse_args (unsigned argc, char **argv)
*** 1130,1146 ****
  	case OPTION_TARGET_HELP:
  	  /* Mention any target specific options.  */
  	  ldemul_list_emulation_options (stdout);
  	  exit (0);
  	case OPTION_TBSS:
! 	  set_section_start (".bss", optarg);
  	  break;
  	case OPTION_TDATA:
! 	  set_section_start (".data", optarg);
  	  break;
  	case OPTION_TTEXT:
! 	  set_section_start (".text", optarg);
  	  break;
  	case OPTION_TRADITIONAL_FORMAT:
  	  link_info.traditional_format = TRUE;
  	  break;
  	case OPTION_TASK_LINK:
--- 1131,1147 ----
  	case OPTION_TARGET_HELP:
  	  /* Mention any target specific options.  */
  	  ldemul_list_emulation_options (stdout);
  	  exit (0);
  	case OPTION_TBSS:
! 	  set_symbol ("__bss_segment_start", optarg);
  	  break;
  	case OPTION_TDATA:
! 	  set_symbol ("__data_segment_start", optarg);
  	  break;
  	case OPTION_TTEXT:
! 	  set_symbol ("__text_segment_start", optarg);
  	  break;
  	case OPTION_TRADITIONAL_FORMAT:
  	  link_info.traditional_format = TRUE;
  	  break;
  	case OPTION_TASK_LINK:
*************** set_section_start (char *sect, char *val
*** 1374,1383 ****
--- 1375,1399 ----
    bfd_vma val = bfd_scan_vma (valstr, &end, 16);
    if (*end)
      einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
    lang_section_start (sect, exp_intop (val));
  }
+ 
+ static void
+ set_symbol (char *symbol, char *valstr)
+ {
+   bfd_vma val;
+   const char *end;
+   char *buf;
+ 
+   val = bfd_scan_vma (valstr, &end, 16);
+   if (*end)
+     einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
+   buf = strdup (symbol);
+   lang_add_assignment (exp_assop ('=', buf, exp_intop (val)));
+ }
+ 
  
  /* Print help messages for the options.  */
  
  static void
  help (void)
Index: emulparams/armsymbian.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/armsymbian.sh,v
retrieving revision 1.4
diff -c -5 -p -r1.4 armsymbian.sh
*** emulparams/armsymbian.sh	30 Sep 2004 17:03:51 -0000	1.4
--- emulparams/armsymbian.sh	23 Oct 2004 01:03:50 -0000
*************** GENERATE_COMBRELOC_SCRIPT=1
*** 4,13 ****
--- 4,15 ----
  OUTPUT_FORMAT="elf32-littlearm-symbian"
  BIG_OUTPUT_FORMAT="elf32-bigarm-symbian"
  LITTLE_OUTPUT_FORMAT="$OUTPUT_FORMAT"
  TARGET1_IS_REL=1
  TARGET2_TYPE=abs
+ # On BPABI systems, program headers should not be mapped.
+ EMBEDDED=yes
  
  # This value should match ELF_MAXPAGESIZE in BFD.  Otherwise, elf.c
  # will not place read-write sections in a separate ELF segment from
  # the read-only sections.
  MAXPAGESIZE=0x8000
Index: scripttempl/armbpabi.sc
===================================================================
RCS file: /cvs/src/src/ld/scripttempl/armbpabi.sc,v
retrieving revision 1.2
diff -c -5 -p -r1.2 armbpabi.sc
*** scripttempl/armbpabi.sc	13 Oct 2004 17:45:31 -0000	1.2
--- scripttempl/armbpabi.sc	23 Oct 2004 01:03:59 -0000
***************
*** 1,80 ****
  # This variant of elf.sc is used for ARM BPABI platforms, like Symbian
  # OS, where a separate postlinker will operated on the generated
! # executable or shared object.
! 
! #
! # Unusual variables checked by this code:
! #	NOP - four byte opcode for no-op (defaults to 0)
! #	NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not
! #		empty.
! #	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 ...
! #		(e.g., .PARISC.milli)
! #	OTHER_TEXT_SECTIONS - these get put in .text when relocating
! #	OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ...
! #		(e.g., .PARISC.global)
! #	OTHER_RELRO_SECTIONS - other than .data.rel.ro ...
! #		(e.g. PPC32 .fixup, .got[12])
! #	OTHER_BSS_SECTIONS - other than .bss .sbss ...
! #	OTHER_SECTIONS - at the end
! #	EXECUTABLE_SYMBOLS - symbols that must be defined for an
! #		executable (e.g., _DYNAMIC_LINK)
! #	TEXT_START_SYMBOLS - symbols that appear at the start of the
! #		.text section.
! #	DATA_START_SYMBOLS - symbols that appear at the start of the
! #		.data section.
! #	OTHER_SDATA_SECTIONS - sections just after .sdata.
! #	OTHER_BSS_SYMBOLS - symbols that appear at the start of the
! #		.bss section besides __bss_start.
! #	DATA_PLT - .plt should be in data segment, not text segment.
! #	PLT_BEFORE_GOT - .plt just before .got when .plt is in data segement.
! #	BSS_PLT - .plt should be in bss segment
! #	TEXT_DYNAMIC - .dynamic in text segment, not data segment.
! #	EMBEDDED - whether this is for an embedded system. 
! #	SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set
! #		start address of shared library.
! #	INPUT_FILES - INPUT command of files to always include
! #	WRITABLE_RODATA - if set, the .rodata section should be writable
! #	INIT_START, INIT_END -  statements just before and just after
! # 	combination of .init sections.
! #	FINI_START, FINI_END - statements just before and just after
! # 	combination of .fini sections.
! #	STACK_ADDR - start of a .stack section.
! #	OTHER_END_SYMBOLS - symbols to place right at the end of the script.
! #	SEPARATE_GOTPLT - if set, .got.plt should be separate output section,
! #		so that .got can be in the RELRO area.  It should be set to
! #		the number of bytes in the beginning of .got.plt which can be
! #		in the RELRO area as well.
! #
! # When adding sections, do note that the names of some sections are used
! # when specifying the start address of the next.
! #
! 
! #  Many sections come in three flavours.  There is the 'real' section,
! #  like ".data".  Then there are the per-procedure or per-variable
! #  sections, generated by -ffunction-sections and -fdata-sections in GCC,
! #  and useful for --gc-sections, which for a variable "foo" might be
! #  ".data.foo".  Then there are the linkonce sections, for which the linker
! #  eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
! #  The exact correspondences are:
! #
! #  Section	Linkonce section
! #  .text	.gnu.linkonce.t.foo
! #  .rodata	.gnu.linkonce.r.foo
! #  .data	.gnu.linkonce.d.foo
! #  .bss		.gnu.linkonce.b.foo
! #  .sdata	.gnu.linkonce.s.foo
! #  .sbss	.gnu.linkonce.sb.foo
! #  .sdata2	.gnu.linkonce.s2.foo
! #  .sbss2	.gnu.linkonce.sb2.foo
! #  .debug_info	.gnu.linkonce.wi.foo
! #  .tdata	.gnu.linkonce.td.foo
! #  .tbss	.gnu.linkonce.tb.foo
! #
! #  Each of these can also have corresponding .rel.* and .rela.* sections.
  
  test -z "$ENTRY" && ENTRY=_start
  test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
  test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
  if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
--- 1,9 ----
  # This variant of elf.sc is used for ARM BPABI platforms, like Symbian
  # OS, where a separate postlinker will operated on the generated
! # executable or shared object.  See elf.sc for configuration variables
! # that apply; only BPABI-specific variables will be noted here.
  
  test -z "$ENTRY" && ENTRY=_start
  test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
  test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
  if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
*************** STACK="  .stack        ${RELOCATING-0}${
*** 173,187 ****
--- 102,132 ----
    {
      ${RELOCATING+_stack = .;}
      *(.stack)
    }"
  
+ # Make all segment markers local.
+ cat <<EOF
+ VERSION {
+   {
+     local: __*_segment_start;
+   };
+ }
+ EOF
+ 
+ TEXT_START_ADDR="(DEFINED(__text_segment_start) ? __text_segment_start : ${TEXT_START_ADDR})"
+ SHLIB_TEXT_START_ADDR="(DEFINED(__text_segment_start) ? __text_segment_start : ${SHLIB_TEXT_START_ADDR:-0})"
+ DATA_ADDR="(DEFINED(__data_segment_start) ? __data_segment_start : ${DATA_ADDR-${DATA_SEGMENT_ALIGN}})"
+ SHLIB_DATA_ADDR="(DEFINED(__data_segment_start) ? __data_segment_start : ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}})"
+ 
  # if this is for an embedded system, don't add SIZEOF_HEADERS.
  if [ -z "$EMBEDDED" ]; then
     test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
+    SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR} + SIZEOF_HEADERS"
  else
     test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
+    SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR}"
  fi
  
  cat <<EOF
  OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
  	      "${LITTLE_OUTPUT_FORMAT}")
*************** ${RELOCATING- /* For some reason, the So
*** 200,269 ****
  
  SECTIONS
  {
    /* Read-only sections, merged into text segment: */
    ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}
!   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
!   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
    ${INITIAL_READONLY_SECTIONS}
  
  EOF
- if [ "x$COMBRELOC" = x ]; then
-   COMBRELOCCAT=cat
- else
-   COMBRELOCCAT="cat > $COMBRELOC"
- fi
- eval $COMBRELOCCAT <<EOF
-   .rel.init     ${RELOCATING-0} : { *(.rel.init) }
-   .rela.init    ${RELOCATING-0} : { *(.rela.init) }
-   .rel.text     ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
-   .rela.text    ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
-   .rel.fini     ${RELOCATING-0} : { *(.rel.fini) }
-   .rela.fini    ${RELOCATING-0} : { *(.rela.fini) }
-   .rel.rodata   ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
-   .rela.rodata  ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
-   ${OTHER_READONLY_RELOC_SECTIONS}
-   .rel.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+*}) }
-   .rela.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+*}) }
-   .rel.data     ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
-   .rela.data    ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
-   .rel.tdata	${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
-   .rela.tdata	${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
-   .rel.tbss	${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
-   .rela.tbss	${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
-   .rel.ctors    ${RELOCATING-0} : { *(.rel.ctors) }
-   .rela.ctors   ${RELOCATING-0} : { *(.rela.ctors) }
-   .rel.dtors    ${RELOCATING-0} : { *(.rel.dtors) }
-   .rela.dtors   ${RELOCATING-0} : { *(.rela.dtors) }
-   ${REL_SDATA}
-   ${REL_SBSS}
-   ${REL_SDATA2}
-   ${REL_SBSS2}
-   .rel.bss      ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
-   .rela.bss     ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
- EOF
- if [ -n "$COMBRELOC" ]; then
- cat <<EOF
-   .rel.dyn      ${RELOCATING-0} :
-     {
- EOF
- sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/      \1/' $COMBRELOC
- cat <<EOF
-     }
-   .rela.dyn     ${RELOCATING-0} :
-     {
- EOF
- sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/      \1/' $COMBRELOC
- cat <<EOF
-     }
- EOF
- fi
  cat <<EOF
-   .rel.plt      ${RELOCATING-0} : { *(.rel.plt) }
-   .rela.plt     ${RELOCATING-0} : { *(.rela.plt) }
-   ${OTHER_PLT_RELOC_SECTIONS}
- 
    .init         ${RELOCATING-0} : 
    { 
      ${RELOCATING+${INIT_START}}
      KEEP (*(.init))
      ${RELOCATING+${INIT_END}}
--- 145,160 ----
  
  SECTIONS
  {
    /* Read-only sections, merged into text segment: */
    ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}
!   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}}
!   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}}
    ${INITIAL_READONLY_SECTIONS}
  
  EOF
  cat <<EOF
    .init         ${RELOCATING-0} : 
    { 
      ${RELOCATING+${INIT_START}}
      KEEP (*(.init))
      ${RELOCATING+${INIT_END}}
*************** cat <<EOF
*** 297,309 ****
    .eh_frame     ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
    .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) }
  
    /* Adjust the address for the data segment.  We want to adjust up to
       the same address within the page on the next page up.  */
!   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}}
!   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
!   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
  
    /* Exception handling  */
    .eh_frame     ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
    .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) }
  
--- 188,200 ----
    .eh_frame     ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
    .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) }
  
    /* Adjust the address for the data segment.  We want to adjust up to
       the same address within the page on the next page up.  */
!   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR};}}}
!   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR};}}
!   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR};}}
  
    /* Exception handling  */
    .eh_frame     ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
    .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) }
  
*************** cat <<EOF
*** 353,362 ****
--- 244,254 ----
    ${CREATE_SHLIB+${SBSS2}}
    ${SDATA}
    ${OTHER_SDATA_SECTIONS}
    ${RELOCATING+_edata = .;}
    ${RELOCATING+PROVIDE (edata = .);}
+   ${RELOCATING+. = DEFINED(__bss_segment_start) ? __bss_segment_start : .;}
    ${RELOCATING+__bss_start = .;}
    ${RELOCATING+${OTHER_BSS_SYMBOLS}}
    ${SBSS}
    ${BSS_PLT+${PLT}}
    .bss          ${RELOCATING-0} :
*************** cat <<EOF
*** 429,435 ****
--- 321,385 ----
  
    ${STACK_ADDR+${STACK}}
    ${OTHER_SECTIONS}
    ${RELOCATING+${OTHER_END_SYMBOLS}}
    ${RELOCATING+${STACKNOTE}}
+ EOF
+ 
+ # These relocations sections are part of the read-only segment in SVR4
+ # executables, but are not mapped in BPABI executables.
+ if [ "x$COMBRELOC" = x ]; then
+   COMBRELOCCAT=cat
+ else
+   COMBRELOCCAT="cat > $COMBRELOC"
+ fi
+ eval $COMBRELOCCAT <<EOF
+   .rel.init     0 : { *(.rel.init) }
+   .rela.init    0 : { *(.rela.init) }
+   .rel.text     0 : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
+   .rela.text    0 : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
+   .rel.fini     0 : { *(.rel.fini) }
+   .rela.fini    0 : { *(.rela.fini) }
+   .rel.rodata   0 : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
+   .rela.rodata  0 : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
+   ${OTHER_READONLY_RELOC_SECTIONS}
+   .rel.data.rel.ro 0 : { *(.rel.data.rel.ro${RELOCATING+*}) }
+   .rela.data.rel.ro 0 : { *(.rel.data.rel.ro${RELOCATING+*}) }
+   .rel.data     0 : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
+   .rela.data    0 : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
+   .rel.tdata	0 : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
+   .rela.tdata	0 : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
+   .rel.tbss	0 : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
+   .rela.tbss	0 : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
+   .rel.ctors    0 : { *(.rel.ctors) }
+   .rela.ctors   0 : { *(.rela.ctors) }
+   .rel.dtors    0 : { *(.rel.dtors) }
+   .rela.dtors   0 : { *(.rela.dtors) }
+   ${REL_SDATA}
+   ${REL_SBSS}
+   ${REL_SDATA2}
+   ${REL_SBSS2}
+   .rel.bss      0 : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
+   .rela.bss     0 : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
+ EOF
+ if [ -n "$COMBRELOC" ]; then
+ cat <<EOF
+   .rel.dyn      0 :
+     {
+ EOF
+ sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/      \1/' $COMBRELOC
+ cat <<EOF
+     }
+   .rela.dyn     0 :
+     {
+ EOF
+ sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/      \1/' $COMBRELOC
+ cat <<EOF
+     }
+ EOF
+ fi
+ cat <<EOF
+   .rel.plt      0 : { *(.rel.plt) }
+   .rela.plt     0 : { *(.rela.plt) }
+   ${OTHER_PLT_RELOC_SECTIONS}
  }
  EOF
Index: scripttempl/elf.sc
===================================================================
RCS file: /cvs/src/src/ld/scripttempl/elf.sc,v
retrieving revision 1.49
diff -c -5 -p -r1.49 elf.sc
*** scripttempl/elf.sc	14 Oct 2004 17:00:16 -0000	1.49
--- scripttempl/elf.sc	23 Oct 2004 01:03:59 -0000
***************
*** 16,25 ****
--- 16,28 ----
  #		(e.g. PPC32 .fixup, .got[12])
  #	OTHER_BSS_SECTIONS - other than .bss .sbss ...
  #	OTHER_SECTIONS - at the end
  #	EXECUTABLE_SYMBOLS - symbols that must be defined for an
  #		executable (e.g., _DYNAMIC_LINK)
+ #       TEXT_START_ADDR - the first byte of the text segment, after any
+ #               headers.
+ #       TEXT_BASE_ADDRESS - the first byte of the text segment.
  #	TEXT_START_SYMBOLS - symbols that appear at the start of the
  #		.text section.
  #	DATA_START_SYMBOLS - symbols that appear at the start of the
  #		.data section.
  #	OTHER_GOT_SYMBOLS - symbols defined just before .got.


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