From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12213 invoked by alias); 1 Jun 2006 05:28:39 -0000 Received: (qmail 12201 invoked by uid 22791); 1 Jun 2006 05:28:38 -0000 X-Spam-Check-By: sourceware.org Received: from smtp102.sbc.mail.mud.yahoo.com (HELO smtp102.sbc.mail.mud.yahoo.com) (68.142.198.201) by sourceware.org (qpsmtpd/0.31) with SMTP; Thu, 01 Jun 2006 05:28:33 +0000 Received: (qmail 23443 invoked from network); 1 Jun 2006 05:28:32 -0000 Received: from unknown (HELO lucon.org) (hjjean@sbcglobal.net@71.146.96.173 with login) by smtp102.sbc.mail.mud.yahoo.com with SMTP; 1 Jun 2006 05:28:31 -0000 Received: by lucon.org (Postfix, from userid 1000) id 59CCE641B3; Wed, 31 May 2006 22:28:30 -0700 (PDT) Date: Thu, 01 Jun 2006 05:28:00 -0000 From: "H. J. Lu" To: binutils@sources.redhat.com Subject: Re: PATCH: Properly handle .tbss section for objcopy Message-ID: <20060601052830.GA19476@lucon.org> References: <20060531231816.GA17378@lucon.org> <20060601013351.GD31056@bubble.grove.modra.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20060601013351.GD31056@bubble.grove.modra.org> User-Agent: Mutt/1.4.2.1i Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2006-06/txt/msg00004.txt.bz2 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 * 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 * 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