diff options
-rw-r--r-- | include/elf/ChangeLog | 7 | ||||
-rw-r--r-- | include/elf/internal.h | 43 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 18 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/binutils.exp | 67 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/commonpage1.d | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/maxpage1.d | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/maxpage1.s | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/maxpage2.d | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/tbss1.s | 24 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/tbss2.s | 16 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/tdata1.s | 24 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/tdata2.s | 16 |
12 files changed, 204 insertions, 30 deletions
diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index fb3476c..285457e 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,10 @@ +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. + 2006-05-27 H.J. Lu <hongjiu.lu@intel.com> * internal.h (struct elf_segment_map): Add p_align and p_align_valid. diff --git a/include/elf/internal.h b/include/elf/internal.h index ff27c88..d368a3f 100644 --- a/include/elf/internal.h +++ b/include/elf/internal.h @@ -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 */ diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 405a18a..c32f594 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,21 @@ +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. + 2006-05-30 H.J. Lu <hongjiu.lu@intel.com> * ld-elf/binutils.exp: New file. diff --git a/ld/testsuite/ld-elf/binutils.exp b/ld/testsuite/ld-elf/binutils.exp index 77ba761..aa59b69 100644 --- a/ld/testsuite/ld-elf/binutils.exp +++ b/ld/testsuite/ld-elf/binutils.exp @@ -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 diff --git a/ld/testsuite/ld-elf/commonpage1.d b/ld/testsuite/ld-elf/commonpage1.d index 5b685b2..76dc056 100644 --- a/ld/testsuite/ld-elf/commonpage1.d +++ b/ld/testsuite/ld-elf/commonpage1.d @@ -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 diff --git a/ld/testsuite/ld-elf/maxpage1.d b/ld/testsuite/ld-elf/maxpage1.d index f7f2dbf..57acda0 100644 --- a/ld/testsuite/ld-elf/maxpage1.d +++ b/ld/testsuite/ld-elf/maxpage1.d @@ -1,6 +1,7 @@ #source: maxpage1.s #ld: -z max-page-size=0x200000 #readelf: -l --wide +#target: *-*-linux* #... LOAD+.*0x200000 diff --git a/ld/testsuite/ld-elf/maxpage1.s b/ld/testsuite/ld-elf/maxpage1.s index b64ee3a..1a7735a 100644 --- a/ld/testsuite/ld-elf/maxpage1.s +++ b/ld/testsuite/ld-elf/maxpage1.s @@ -1,6 +1,12 @@ + .globl main + .globl start + .globl _start + .globl __start .text - .global _start +main: +start: _start: +__start: .long 0 .data diff --git a/ld/testsuite/ld-elf/maxpage2.d b/ld/testsuite/ld-elf/maxpage2.d new file mode 100644 index 0000000..7fe9379 --- /dev/null +++ b/ld/testsuite/ld-elf/maxpage2.d @@ -0,0 +1,9 @@ +#source: maxpage1.s +#ld: -z max-page-size=0x100000 +#readelf: -l --wide +#target: *-*-linux* + +#... + LOAD+.*0x100000 + LOAD+.*0x100000 +#pass diff --git a/ld/testsuite/ld-elf/tbss1.s b/ld/testsuite/ld-elf/tbss1.s new file mode 100644 index 0000000..4f1631f --- /dev/null +++ b/ld/testsuite/ld-elf/tbss1.s @@ -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 diff --git a/ld/testsuite/ld-elf/tbss2.s b/ld/testsuite/ld-elf/tbss2.s new file mode 100644 index 0000000..b980925 --- /dev/null +++ b/ld/testsuite/ld-elf/tbss2.s @@ -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 diff --git a/ld/testsuite/ld-elf/tdata1.s b/ld/testsuite/ld-elf/tdata1.s new file mode 100644 index 0000000..6ea57b6 --- /dev/null +++ b/ld/testsuite/ld-elf/tdata1.s @@ -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 diff --git a/ld/testsuite/ld-elf/tdata2.s b/ld/testsuite/ld-elf/tdata2.s new file mode 100644 index 0000000..1da459f --- /dev/null +++ b/ld/testsuite/ld-elf/tdata2.s @@ -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 |