This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: Properly handle .tbss section for objcopy
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Date: Wed, 31 May 2006 22:28:30 -0700
- Subject: Re: PATCH: Properly handle .tbss section for objcopy
- References: <20060531231816.GA17378@lucon.org> <20060601013351.GD31056@bubble.grove.modra.org>
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