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.
This commit is contained in:
parent
117ed4f8d5
commit
1224efb888
12 changed files with 204 additions and 30 deletions
|
@ -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.
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#source: maxpage1.s
|
||||
#ld: -z max-page-size=0x200000
|
||||
#readelf: -l --wide
|
||||
#target: *-*-linux*
|
||||
|
||||
#...
|
||||
LOAD+.*0x200000
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
.globl main
|
||||
.globl start
|
||||
.globl _start
|
||||
.globl __start
|
||||
.text
|
||||
.global _start
|
||||
main:
|
||||
start:
|
||||
_start:
|
||||
__start:
|
||||
.long 0
|
||||
|
||||
.data
|
||||
|
|
9
ld/testsuite/ld-elf/maxpage2.d
Normal file
9
ld/testsuite/ld-elf/maxpage2.d
Normal file
|
@ -0,0 +1,9 @@
|
|||
#source: maxpage1.s
|
||||
#ld: -z max-page-size=0x100000
|
||||
#readelf: -l --wide
|
||||
#target: *-*-linux*
|
||||
|
||||
#...
|
||||
LOAD+.*0x100000
|
||||
LOAD+.*0x100000
|
||||
#pass
|
24
ld/testsuite/ld-elf/tbss1.s
Normal file
24
ld/testsuite/ld-elf/tbss1.s
Normal file
|
@ -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
|
16
ld/testsuite/ld-elf/tbss2.s
Normal file
16
ld/testsuite/ld-elf/tbss2.s
Normal file
|
@ -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
|
24
ld/testsuite/ld-elf/tdata1.s
Normal file
24
ld/testsuite/ld-elf/tdata1.s
Normal file
|
@ -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
|
16
ld/testsuite/ld-elf/tdata2.s
Normal file
16
ld/testsuite/ld-elf/tdata2.s
Normal file
|
@ -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
|
Loading…
Reference in a new issue