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:
H.J. Lu 2006-06-01 05:40:24 +00:00
parent 117ed4f8d5
commit 1224efb888
12 changed files with 204 additions and 30 deletions

View 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.

View 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 */

View 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.

View 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

View 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

View file

@ -1,6 +1,7 @@
#source: maxpage1.s
#ld: -z max-page-size=0x200000
#readelf: -l --wide
#target: *-*-linux*
#...
LOAD+.*0x200000

View file

@ -1,6 +1,12 @@
.globl main
.globl start
.globl _start
.globl __start
.text
.global _start
main:
start:
_start:
__start:
.long 0
.data

View file

@ -0,0 +1,9 @@
#source: maxpage1.s
#ld: -z max-page-size=0x100000
#readelf: -l --wide
#target: *-*-linux*
#...
LOAD+.*0x100000
LOAD+.*0x100000
#pass

View 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

View 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

View 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

View 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