include/elf/
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 1 Jun 2006 05:40:24 +0000 (05:40 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 1 Jun 2006 05:40:24 +0000 (05:40 +0000)
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.

12 files changed:
include/elf/ChangeLog
include/elf/internal.h
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/binutils.exp
ld/testsuite/ld-elf/commonpage1.d
ld/testsuite/ld-elf/maxpage1.d
ld/testsuite/ld-elf/maxpage1.s
ld/testsuite/ld-elf/maxpage2.d [new file with mode: 0644]
ld/testsuite/ld-elf/tbss1.s [new file with mode: 0644]
ld/testsuite/ld-elf/tbss2.s [new file with mode: 0644]
ld/testsuite/ld-elf/tdata1.s [new file with mode: 0644]
ld/testsuite/ld-elf/tdata2.s [new file with mode: 0644]

index fb3476cf60935da993801082a60f536513953e1b..285457ed91f821b6d9f2af02f98d76541f257fd0 100644 (file)
@@ -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.
index ff27c88bd441ff13a46448ebf0093411f0b06a98..d368a3fa6e7401a81cdfc7bd0f2d7883f3766945 100644 (file)
@@ -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 */
index 405a18a01a2e6dba19c7bbdc5948c487a78b14d1..c32f594326bd230d9b150e94dd4a5cbb527e8de5 100644 (file)
@@ -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.
index 77ba76113099b58ef0a887f342974bf4f9717510..aa59b6909cc60e223c84e28a75e294d639155a45 100644 (file)
 
 # 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
index 5b685b29a8b070048978c59bfa352cfed4ec664b..76dc0565b3420a77741784f5cd62c30994df716b 100644 (file)
@@ -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
index f7f2dbfc83120636c6634ca877f670112ab93514..57acda090a95dcd5dab88965a2acc7d569418204 100644 (file)
@@ -1,6 +1,7 @@
 #source: maxpage1.s
 #ld: -z max-page-size=0x200000
 #readelf: -l --wide
+#target: *-*-linux*
 
 #...
   LOAD+.*0x200000
index b64ee3a9d36654221d3a9ccbe777c4c8a4f291ed..1a7735a8f2f566d27bb73bebffa58c9a4b1a7a75 100644 (file)
@@ -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 (file)
index 0000000..7fe9379
--- /dev/null
@@ -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 (file)
index 0000000..4f1631f
--- /dev/null
@@ -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 (file)
index 0000000..b980925
--- /dev/null
@@ -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 (file)
index 0000000..6ea57b6
--- /dev/null
@@ -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 (file)
index 0000000..1da459f
--- /dev/null
@@ -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