This is the mail archive of the binutils@sourceware.org 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: Properly handle .tbss section for objcopy


On Thu, Jun 01, 2006 at 11:03:51AM +0930, Alan Modra wrote:
> On Wed, May 31, 2006 at 04:18:16PM -0700, H. J. Lu wrote:
> > 	* internal.h (ELF_SECTION_SIZE): New.
> > 	(ELF_IS_SECTION_IN_SEGMENT): Likewise.
> > 	(ELF_IS_SECTION_IN_SEGMENT_FILE): Updated.
> > 	(ELF_IS_SECTION_IN_SEGMENT_MEMORY): Likewise.
> 
> This looks good.
> 
> > 	* ld-elf/binutils.exp (strip_test): Renamed to binutils_test.
> > 	Check for unsupported options. Add more tests.
> > 
> > 	* ld-elf/maxpage1.s: Add start and __start.
> > 
> > 	* ld-elf/maxpage2.d: New file.
> > 	* ld-elf/tbss1.s: Likewise.
> > 	* ld-elf/tbss2.s: Likewise.
> > 	* ld-elf/tdata1.s: Likewise.
> > 	* ld-elf/tdata2.s: Likewise.
> 
> For the sake of hppa64, please add "main" as well as "start" and
> "__start".  OK with that change.
> 

Here is the updated patch. I also made those tests Linux only. I am
checking it in.


H.J.
---
include/elf/

2006-05-31  H.J. Lu  <hongjiu.lu@intel.com>

	* internal.h (ELF_SECTION_SIZE): New.
	(ELF_IS_SECTION_IN_SEGMENT): Likewise.
	(ELF_IS_SECTION_IN_SEGMENT_FILE): Updated.
	(ELF_IS_SECTION_IN_SEGMENT_MEMORY): Likewise.

ld/testsuite/

2006-05-31  H.J. Lu  <hongjiu.lu@intel.com>

	* ld-elf/binutils.exp: Make it Linux only.
	(strip_test): Renamed to binutils_test. Check for unsupported
	options.
	Add more tests.

	* ld-elf/commonpage1.d: Make it Linux only.
	* ld-elf/maxpage1.d: Likewise.

	* ld-elf/maxpage1.s: Add main, start and __start.

	* ld-elf/maxpage2.d: New file.
	* ld-elf/tbss1.s: Likewise.
	* ld-elf/tbss2.s: Likewise.
	* ld-elf/tdata1.s: Likewise.
	* ld-elf/tdata2.s: Likewise.

--- binutils/include/elf/internal.h.max	2006-05-30 09:19:38.000000000 -0700
+++ binutils/include/elf/internal.h	2006-05-31 16:10:10.000000000 -0700
@@ -256,29 +256,42 @@ struct elf_segment_map
   asection *sections[1];
 };
 
-/* Decide if the given sec_hdr is in the given segment in file.  */
-#define ELF_IS_SECTION_IN_SEGMENT_FILE(sec_hdr, segment)	\
-  (sec_hdr->sh_size > 0						\
-   /* PT_TLS segment contains only SHF_TLS sections.  */	\
-   && (segment->p_type != PT_TLS				\
-       || (sec_hdr->sh_flags & SHF_TLS) != 0)			\
+/* .tbss is special.  It doesn't contribute memory space to normal
+   segments and it doesn't take file space in normal segments.  */
+#define ELF_SECTION_SIZE(sec_hdr, segment)			\
+   (((sec_hdr->sh_flags & SHF_TLS) == 0				\
+     || sec_hdr->sh_type != SHT_NOBITS				\
+     || segment->p_type == PT_TLS) ? sec_hdr->sh_size : 0)
+
+/* Decide if the given sec_hdr is in the given segment.  PT_TLS segment
+   contains only SHF_TLS sections.  Only PT_LOAD and PT_TLS segments
+   can contain SHF_TLS sections.  */
+#define ELF_IS_SECTION_IN_SEGMENT(sec_hdr, segment)		\
+  (((((sec_hdr->sh_flags & SHF_TLS) != 0)			\
+     && (segment->p_type == PT_TLS				\
+	 || segment->p_type == PT_LOAD))			\
+    || ((sec_hdr->sh_flags & SHF_TLS) == 0			\
+	&& segment->p_type != PT_TLS))				\
    /* Compare allocated sec_hdrs by VMA, unallocated sec_hdrs	\
       by file offset.  */					\
    && (sec_hdr->sh_flags & SHF_ALLOC				\
        ? (sec_hdr->sh_addr >= segment->p_vaddr			\
-	  && sec_hdr->sh_addr + sec_hdr->sh_size		\
-	  <= segment->p_vaddr + segment->p_memsz)		\
+	  && (sec_hdr->sh_addr					\
+	      + ELF_SECTION_SIZE(sec_hdr, segment)		\
+	      <= segment->p_vaddr + segment->p_memsz))		\
        : ((bfd_vma) sec_hdr->sh_offset >= segment->p_offset	\
-	  && (sec_hdr->sh_offset + sec_hdr->sh_size		\
+	  && (sec_hdr->sh_offset				\
+	      + ELF_SECTION_SIZE(sec_hdr, segment)		\
 	      <= segment->p_offset + segment->p_filesz))))
 
+/* Decide if the given sec_hdr is in the given segment in file.  */
+#define ELF_IS_SECTION_IN_SEGMENT_FILE(sec_hdr, segment)	\
+  (sec_hdr->sh_size > 0						\
+   && ELF_IS_SECTION_IN_SEGMENT (sec_hdr, segment))
+
 /* Decide if the given sec_hdr is in the given segment in memory.  */
 #define ELF_IS_SECTION_IN_SEGMENT_MEMORY(sec_hdr, segment)	\
-  (ELF_IS_SECTION_IN_SEGMENT_FILE (sec_hdr, segment)		\
-   /* .tbss is special.  It doesn't contribute memory space to	\
-      normal segments.  */					\
-   && (!((sec_hdr->sh_flags & SHF_TLS) != 0			\
-	 && sec_hdr->sh_type == SHT_NOBITS)			\
-       || segment->p_type == PT_TLS))
+  (ELF_SECTION_SIZE(sec_hdr, segment) > 0			\
+   && ELF_IS_SECTION_IN_SEGMENT (sec_hdr, segment))
 
 #endif /* _ELF_INTERNAL_H */
--- binutils/ld/testsuite/ld-elf/binutils.exp.max	2006-05-30 09:45:32.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/binutils.exp	2006-05-31 21:50:18.000000000 -0700
@@ -20,26 +20,41 @@
 
 # Make sure that binutils can correctly handle ld output in ELF.
 
-# This test can only be run on ELF platforms.
-if ![is_elf_format] {
+# Run on Linux only.
+if { ![istarget *-*-linux*] } {
     return
 }
 
-proc strip_test { ld_options test } {
+if { [istarget *-*-linux*aout*]
+     || [istarget *-*-linux*oldld*] } {
+    return
+}
+
+proc binutils_test { prog_name ld_options test } {
     global as
     global ld
     global READELF
+    global objcopy
     global strip
     global srcdir
     global subdir
+    global link_output
+
+    eval set prog \$$prog_name
+    set test_name "$prog_name $ld_options ($test)"
 
     if { ![ld_assemble $as $srcdir/$subdir/$test.s tmpdir/$test.o ] } {
-	unresolved "$ld_options"
+	unresolved "$test_name"
 	return
     }
 
     if { ![ld_simple_link $ld tmpdir/$test "$ld_options tmpdir/$test.o"] } {
-	unresolved "$ld_options"
+	if { [string match "*not supported*" $link_output]
+	     || [string match "*unrecognized option*" $link_output] } {
+	    unsupported "$ld_options is not supported by this target"
+	} else {
+	    unresolved "$test_name"
+	}
 	return
     }
 
@@ -47,15 +62,15 @@ proc strip_test { ld_options test } {
     catch "exec $READELF -l --wide tmpdir/$test > tmpdir/$test.exp" got
     if ![string match "" $got] then {
 	send_log "$got\n"
-	unresolved "$ld_options"
+	unresolved "$test_name"
 	return
     }
 
-    send_log "$strip tmpdir/$test\n"
-    catch "exec $strip tmpdir/$test" got
+    send_log "$prog tmpdir/$test\n"
+    catch "exec $prog tmpdir/$test" got
     if ![string match "" $got] then {
 	send_log "$got\n"
-	unresolved "$ld_options"
+	fail "$test_name"
 	return
     }
 
@@ -63,18 +78,42 @@ proc strip_test { ld_options test } {
     catch "exec $READELF -l --wide tmpdir/$test > tmpdir/$test.out" got
     if ![string match "" $got] then {
 	send_log "$got\n"
-	unresolved "$ld_options"
+	unresolved "$test_name"
 	return
     }
 
     if { [catch {exec cmp tmpdir/$test.exp tmpdir/$test.out}] } then {
 	send_log "tmpdir/$test.exp tmpdir/$test.out differ.\n"
-	fail "$ld_options"
+	fail "$test_name"
 	return
     }
 
-    pass "$ld_options"
+    pass "$test_name"
 }
 
-strip_test "-z max-page-size=0x200000" maxpage1
-strip_test "-z max-page-size=0x200000 -z common-page-size=0x100000" maxpage1
+binutils_test strip "-z max-page-size=0x200000" maxpage1
+binutils_test strip "-z max-page-size=0x200000 -z common-page-size=0x100000" maxpage1
+binutils_test strip "-z max-page-size=0x100000" maxpage1
+binutils_test strip "-z max-page-size=0x100000 -z common-page-size=0x1000" maxpage1
+
+binutils_test strip "" maxpage1
+binutils_test strip "-shared" maxpage1
+binutils_test objcopy "" maxpage1
+binutils_test objcopy "-shared" maxpage1
+
+binutils_test objcopy "" tbss1
+binutils_test objcopy "-shared" tbss1
+binutils_test objcopy "-z max-page-size=0x100000" tbss1
+binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss1
+binutils_test objcopy "" tdata1
+binutils_test objcopy "-shared" tdata1
+binutils_test objcopy "-z max-page-size=0x100000" tdata1
+binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata1
+binutils_test objcopy "" tbss2
+binutils_test objcopy "-shared" tbss2
+binutils_test objcopy "-z max-page-size=0x100000" tbss2
+binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss2
+binutils_test objcopy "-z max-page-size=0x100000" tdata2
+binutils_test objcopy "" tdata2
+binutils_test objcopy "-shared" tdata2
+binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata2
--- binutils/ld/testsuite/ld-elf/commonpage1.d.max	2006-05-30 09:45:32.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/commonpage1.d	2006-05-31 21:52:06.000000000 -0700
@@ -1,6 +1,7 @@
 #source: maxpage1.s
 #ld: -z max-page-size=0x200000 -z common-page-size=0x100000
 #readelf: -l --wide
+#target: *-*-linux*
 
 #...
   LOAD+.*0x200000
--- binutils/ld/testsuite/ld-elf/maxpage1.d.max	2006-05-30 09:45:32.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/maxpage1.d	2006-05-31 21:52:10.000000000 -0700
@@ -1,6 +1,7 @@
 #source: maxpage1.s
 #ld: -z max-page-size=0x200000
 #readelf: -l --wide
+#target: *-*-linux*
 
 #...
   LOAD+.*0x200000
--- binutils/ld/testsuite/ld-elf/maxpage1.s.max	2006-05-30 09:45:32.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/maxpage1.s	2006-05-31 21:57:48.000000000 -0700
@@ -1,6 +1,12 @@
+	.globl main
+	.globl start
+	.globl _start
+	.globl __start
 	.text
-	.global _start
+main:
+start:
 _start:
+__start:
 	.long	0
 
 	.data
--- binutils/ld/testsuite/ld-elf/maxpage2.d.max	2006-05-31 16:10:10.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/maxpage2.d	2006-05-31 21:52:14.000000000 -0700
@@ -0,0 +1,9 @@
+#source: maxpage1.s
+#ld: -z max-page-size=0x100000
+#readelf: -l --wide
+#target: *-*-linux*
+
+#...
+  LOAD+.*0x100000
+  LOAD+.*0x100000
+#pass
--- binutils/ld/testsuite/ld-elf/tbss1.s.max	2006-05-31 16:10:10.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/tbss1.s	2006-05-31 21:57:41.000000000 -0700
@@ -0,0 +1,24 @@
+	.globl main
+	.globl start
+	.globl _start
+	.globl __start
+	.text
+main:
+start:
+_start:
+__start:
+	.byte 0
+	.globl bss
+	.section	.bss,"aw",%nobits
+	.p2align 12
+	.type	bss,%object
+	.size	bss,4096
+bss:
+	.zero	4096
+	.globl tbss
+	.section	.tbss,"awT",%nobits
+	.p2align 12
+	.type	tbss,%object
+	.size	tbss,4096
+tbss:
+	.zero	4096
--- binutils/ld/testsuite/ld-elf/tbss2.s.max	2006-05-31 16:10:10.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/tbss2.s	2006-05-31 21:56:40.000000000 -0700
@@ -0,0 +1,16 @@
+	.globl main
+	.globl start
+	.globl _start
+	.globl __start
+	.text
+main:
+start:
+_start:
+__start:
+	.byte 0
+	.globl tbss
+	.section	.tbss,"awT",%nobits
+	.type	tbss,%object
+	.size	tbss,1
+tbss:
+	.zero	1
--- binutils/ld/testsuite/ld-elf/tdata1.s.max	2006-05-31 16:10:10.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/tdata1.s	2006-05-31 21:56:32.000000000 -0700
@@ -0,0 +1,24 @@
+	.globl main
+	.globl start
+	.globl _start
+	.globl __start
+	.text
+main:
+start:
+_start:
+__start:
+	.byte 0
+	.globl data
+	.section	.data,"aw",%progbits
+	.p2align 4
+	.type	data,%object
+	.size	data,4096
+data:
+	.zero	4096
+	.globl tdata
+	.section	.tdata,"awT",%progbits
+	.p2align 4
+	.type	tdata,%object
+	.size	tdata,4096
+tdata:
+	.zero	4096
--- binutils/ld/testsuite/ld-elf/tdata2.s.max	2006-05-31 16:10:10.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/tdata2.s	2006-05-31 21:56:17.000000000 -0700
@@ -0,0 +1,16 @@
+	.globl main
+	.globl start
+	.globl _start
+	.globl __start
+	.text
+main:
+start:
+_start:
+__start:
+	.byte 0
+	.globl tdata
+	.section	.tdata,"awT",%progbits
+	.type	tdata,%object
+	.size	tdata,1
+tdata:
+	.byte 0


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