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]

SIZEOF and .tbss


For an embedded system, I was trying to write a linker script which generated
a table of data image locations, something like
   .map : {
     LONG (ADDR (.data)) LONG (LOADADDR(.data)) SIZEOF (.data) SIZEOF (.bss)
     LONG (ADDR (.tdata)) LONG (LOADADDR(.tdata)) SIZEOF (.tdata) SIZEOF (.tbss)
   }
The idea being that part of crt0 would copy and initialize these areas.
Unfortunately SIZEOF (.tbss) is always zero, because of the way the linker
has to allow .tdata,.tbss to occupy the loadable image, without forcing
a gap where .tbss is.

This patch implements that functionality in a different manner. Rather than
lie about .tbss's size, I tweak the couple of places that need to know
it can be ignored for layout purposes.

tested on i686-pc-linux-gnu & ia64-unknown-linux-gnu, ok?

nathan

--
Nathan Sidwell    ::   http://www.codesourcery.com   ::     CodeSourcery LLC
nathan@codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk

2004-02-23  Nathan Sidwell  <nathan@codesourcery.com>

	* ldlang.c (lang_add_section): Don't force SEC_LOAD on
	SEC_THREAD_LOCAL.
	(IGNORE_SECTION): Ignore .tbss sections too.
	(lang_size_sections_1): .tbss sections do not advance dot.

	* ld-scripts/size.exp: New.
	* ld-scripts/size-[12].{d,s,t}: New.

Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.138
diff -c -3 -p -r1.138 ldlang.c
*** ld/ldlang.c	23 Feb 2004 10:10:01 -0000	1.138
--- ld/ldlang.c	23 Feb 2004 11:23:56 -0000
*************** lang_add_section (lang_statement_list_ty
*** 1101,1110 ****
  	  flags &= ~ (SEC_MERGE | SEC_STRINGS);
  	}
  
-       /* For now make .tbss normal section.  */
-       if ((flags & SEC_THREAD_LOCAL) && ! link_info.relocatable)
- 	flags |= SEC_LOAD;
- 
        section->output_section->flags |= flags;
  
        if (flags & SEC_MERGE)
--- 1101,1106 ----
*************** size_input_section (lang_statement_union
*** 2770,2777 ****
  }
  
  #define IGNORE_SECTION(bfd, s) \
!   (((bfd_get_section_flags (bfd, s) & (SEC_ALLOC | SEC_NEVER_LOAD))	\
!     != SEC_ALLOC)							\
     || bfd_section_size (bfd, s) == 0)
  
  /* Check to see if any allocated sections overlap with other allocated
--- 2766,2776 ----
  }
  
  #define IGNORE_SECTION(bfd, s) \
!   (((bfd_get_section_flags (bfd, s) & SEC_THREAD_LOCAL)			\
!     ? ((bfd_get_section_flags (bfd, s) & (SEC_LOAD | SEC_NEVER_LOAD))	\
!        != SEC_LOAD)							\
!     :  ((bfd_get_section_flags (bfd, s) & (SEC_ALLOC | SEC_NEVER_LOAD)) \
! 	!= SEC_ALLOC))							\
     || bfd_section_size (bfd, s) == 0)
  
  /* Check to see if any allocated sections overlap with other allocated
*************** lang_size_sections_1
*** 3021,3035 ****
  
  	    if (bfd_is_abs_section (os->bfd_section))
  	      ASSERT (after == os->bfd_section->vma);
- 	    else if ((os->bfd_section->flags & SEC_HAS_CONTENTS) == 0
- 		     && (os->bfd_section->flags & SEC_THREAD_LOCAL)
- 		     && ! link_info.relocatable)
- 	      os->bfd_section->_raw_size = 0;
  	    else
  	      os->bfd_section->_raw_size
  		= TO_SIZE (after - os->bfd_section->vma);
  
! 	    dot = os->bfd_section->vma + TO_ADDR (os->bfd_section->_raw_size);
  	    os->processed = 1;
  
  	    if (os->update_dot_tree != 0)
--- 3020,3036 ----
  
  	    if (bfd_is_abs_section (os->bfd_section))
  	      ASSERT (after == os->bfd_section->vma);
  	    else
  	      os->bfd_section->_raw_size
  		= TO_SIZE (after - os->bfd_section->vma);
  
! 	    dot = os->bfd_section->vma;
! 	    /* .tbss sections effectively have zero size.  */
! 	    if ((os->bfd_section->flags & SEC_HAS_CONTENTS) != 0
! 		|| (os->bfd_section->flags & SEC_THREAD_LOCAL) == 0
! 		|| link_info.relocatable)
! 	      dot += TO_ADDR (os->bfd_section->_raw_size);
! 
  	    os->processed = 1;
  
  	    if (os->update_dot_tree != 0)
Index: ld/testsuite/ld-scripts/size-1.d
===================================================================
RCS file: ld/testsuite/ld-scripts/size-1.d
diff -N ld/testsuite/ld-scripts/size-1.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-scripts/size-1.d	23 Feb 2004 11:24:00 -0000
***************
*** 0 ****
--- 1,16 ----
+ #source: size-1.s
+ #ld: -T size-1.t
+ #objdump: -s
+ 
+ .*:     file format .*
+ 
+ Contents of section \.text:
+  0+00 (01)?000000(01)? (02)?000000(02)?                    ........        
+ Contents of section \.data:
+  0+08 (03)?000000(03)? (04)?000000(04)? (05)?000000(05)?           ............    
+ Contents of section \.tdata:
+  0+24 (06)?000000 07000000 08000000 09000000  ................
+  0+34 (0a)?000000                             ....            
+ Contents of section \.map:
+  0+38 (08)?000000(08)? (0c)?000000(0c)? (10)?000000(10)? (14)?000000(14)?  ................
+  0+48 (18)?000000(18)?                             ....            
Index: ld/testsuite/ld-scripts/size-1.s
===================================================================
RCS file: ld/testsuite/ld-scripts/size-1.s
diff -N ld/testsuite/ld-scripts/size-1.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-scripts/size-1.s	23 Feb 2004 11:24:00 -0000
***************
*** 0 ****
--- 1,15 ----
+ 	.section .text,"ax",@progbits
+ 	.long 1,2
+ 
+ 	.section .data,"aw",@progbits
+ 	.long 3,4,5
+ 
+ 	.section .bss,"aw",@nobits
+ 	.long 0,0,0,0
+ 	
+ 	# thread local storage sections
+ 	.section .tdata,"awT",@progbits
+ 	.long 6,7,8,9,10
+ 	
+ 	.section .tbss,"awT",@nobits
+ 	.long 0,0,0,0,0,0
Index: ld/testsuite/ld-scripts/size-1.t
===================================================================
RCS file: ld/testsuite/ld-scripts/size-1.t
diff -N ld/testsuite/ld-scripts/size-1.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-scripts/size-1.t	23 Feb 2004 11:24:00 -0000
***************
*** 0 ****
--- 1,15 ----
+ SECTIONS
+ {
+   .text : { *(.text) }
+   .data : { *(.data) }
+   .bss : { *(.bss) }
+   .tdata : { *(.tdata) }
+   .tbss : { *(.tbss) }
+   .map : {
+     LONG (SIZEOF (.text))
+     LONG (SIZEOF (.data))
+     LONG (SIZEOF (.bss))
+     LONG (SIZEOF (.tdata))
+     LONG (SIZEOF (.tbss))
+   }
+ }
Index: ld/testsuite/ld-scripts/size-2.d
===================================================================
RCS file: ld/testsuite/ld-scripts/size-2.d
diff -N ld/testsuite/ld-scripts/size-2.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-scripts/size-2.d	23 Feb 2004 11:24:00 -0000
***************
*** 0 ****
--- 1,20 ----
+ #source: size-2.s
+ #ld: -T size-2.t
+ #readelf: -l
+ 
+ #...
+ Program Headers:
+   Type           Offset             VirtAddr           PhysAddr
+                  FileSiz            MemSiz              Flags  Align
+   PHDR           0x[0-9a-f]+ 0x0+0000 0x0+0000
+                  0x[0-9a-f]+ 0x[0-9a-f]+  R      .
+   LOAD           0x[0-9a-f]+ 0x0+0000 0x0+0000
+                  0x0+0030 0x0+0030  R      [0-9a-f]+
+   TLS            0x[0-9a-f]+ 0x0+0008 0x0+0008
+                  0x0+0014 0x0+002c  R      [0-9a-f]+
+ 
+  Section to Segment mapping:
+   Segment Sections...
+    00     \.text \.tdata \.tbss \.map 
+    01     \.text \.tdata \.map 
+    02     \.tdata \.tbss \.map 
Index: ld/testsuite/ld-scripts/size-2.s
===================================================================
RCS file: ld/testsuite/ld-scripts/size-2.s
diff -N ld/testsuite/ld-scripts/size-2.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-scripts/size-2.s	23 Feb 2004 11:24:00 -0000
***************
*** 0 ****
--- 1,9 ----
+ 	.section .text,"ax",@progbits
+ 	.long 1,2
+ 
+ 	# thread local storage sections
+ 	.section .tdata,"awT",@progbits
+ 	.long 6,7,8,9,10
+ 	
+ 	.section .tbss,"awT",@nobits
+ 	.long 0,0,0,0,0,0
Index: ld/testsuite/ld-scripts/size-2.t
===================================================================
RCS file: ld/testsuite/ld-scripts/size-2.t
diff -N ld/testsuite/ld-scripts/size-2.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-scripts/size-2.t	23 Feb 2004 11:24:00 -0000
***************
*** 0 ****
--- 1,21 ----
+ PHDRS
+ {
+   header PT_PHDR FILEHDR PHDRS ;
+ 	 
+   image PT_LOAD FLAGS (4);
+   tls PT_TLS FLAGS (4);
+   
+ }
+ SECTIONS
+ {
+   .text : { *(.text) } :image
+   .tdata : { *(.tdata) } :image :tls
+   .tbss : { *(.tbss) } :image : tls
+   .map : {
+     LONG (SIZEOF (.text))
+     LONG (SIZEOF (.data))
+     LONG (SIZEOF (.bss))
+     LONG (SIZEOF (.tdata))
+     LONG (SIZEOF (.tbss))
+   } :image
+ }
Index: ld/testsuite/ld-scripts/size.exp
===================================================================
RCS file: ld/testsuite/ld-scripts/size.exp
diff -N ld/testsuite/ld-scripts/size.exp
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-scripts/size.exp	23 Feb 2004 11:24:00 -0000
***************
*** 0 ****
--- 1,23 ----
+ # Expect script for SIZEOF tests
+ #   Copyright (C) 2004 Free Software Foundation
+ #
+ # This file is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 2 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ # GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, write to the Free Software
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ #
+ 
+ run_dump_test size-1
+ 
+ if { [istarget "*-*-elf*"] } {
+     run_dump_test size-2
+ }

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