Fix handling of GNU Property notes that are not in a GNU NOTE PROPERTY section.
PR 22450 gas * elf-properties.c (_bfd_elf_link_setup_gnu_properties): Skip objects without a GNU_PROPERTY note section when looking for a bfd onto which notes can be accumulated. ld * testsuite/ld-elf/elf.exp: Add --defsym ALIGN=2|3 to assembler command line depending upon the size of the target address space. * testsuite/ld-elf/pr22450.s: New test file. * testsuite/ld-elf/pr22450.d: New test driver. * testsuite/config/default.exp: Add note that LD_CLASS refers to the size of the host linker not the size of the target linker.
This commit is contained in:
parent
b7486a74a6
commit
b77db948f4
|
@ -1,3 +1,10 @@
|
||||||
|
2017-11-20 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
PR 22450
|
||||||
|
* elf-properties.c (_bfd_elf_link_setup_gnu_properties): Skip
|
||||||
|
objects without a GNU_PROPERTY note section when looking for a bfd
|
||||||
|
onto which notes can be accumulated.
|
||||||
|
|
||||||
2017-11-20 Alan Modra <amodra@gmail.com>
|
2017-11-20 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
PR 22451
|
PR 22451
|
||||||
|
|
|
@ -328,11 +328,15 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
|
||||||
has_properties = TRUE;
|
has_properties = TRUE;
|
||||||
|
|
||||||
/* Ignore GNU properties from ELF objects with different machine
|
/* Ignore GNU properties from ELF objects with different machine
|
||||||
code or class. */
|
code or class. Also skip objects without a GNU_PROPERTY note
|
||||||
|
section. */
|
||||||
if ((elf_machine_code
|
if ((elf_machine_code
|
||||||
== get_elf_backend_data (abfd)->elf_machine_code)
|
== get_elf_backend_data (abfd)->elf_machine_code)
|
||||||
&& (elfclass
|
&& (elfclass
|
||||||
== get_elf_backend_data (abfd)->s->elfclass))
|
== get_elf_backend_data (abfd)->s->elfclass)
|
||||||
|
&& bfd_get_section_by_name (abfd,
|
||||||
|
NOTE_GNU_PROPERTY_SECTION_NAME) != NULL
|
||||||
|
)
|
||||||
{
|
{
|
||||||
/* Keep .note.gnu.property section in FIRST_PBFD. */
|
/* Keep .note.gnu.property section in FIRST_PBFD. */
|
||||||
first_pbfd = abfd;
|
first_pbfd = abfd;
|
||||||
|
@ -374,9 +378,10 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
|
||||||
|
|
||||||
if (list != NULL)
|
if (list != NULL)
|
||||||
{
|
{
|
||||||
/* Discard .note.gnu.property section in the rest inputs. */
|
/* Discard the .note.gnu.property section in this bfd. */
|
||||||
sec = bfd_get_section_by_name (abfd,
|
sec = bfd_get_section_by_name (abfd,
|
||||||
NOTE_GNU_PROPERTY_SECTION_NAME);
|
NOTE_GNU_PROPERTY_SECTION_NAME);
|
||||||
|
if (sec != NULL)
|
||||||
sec->output_section = bfd_abs_section_ptr;
|
sec->output_section = bfd_abs_section_ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -393,6 +398,7 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
|
||||||
|
|
||||||
sec = bfd_get_section_by_name (first_pbfd,
|
sec = bfd_get_section_by_name (first_pbfd,
|
||||||
NOTE_GNU_PROPERTY_SECTION_NAME);
|
NOTE_GNU_PROPERTY_SECTION_NAME);
|
||||||
|
BFD_ASSERT (sec != NULL);
|
||||||
|
|
||||||
/* Update stack size in .note.gnu.property with -z stack-size=N
|
/* Update stack size in .note.gnu.property with -z stack-size=N
|
||||||
if N > 0. */
|
if N > 0. */
|
||||||
|
|
10
ld/ChangeLog
10
ld/ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2017-11-20 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
PR 22450
|
||||||
|
* testsuite/ld-elf/elf.exp: Add --defsym ALIGN=2|3 to assembler
|
||||||
|
command line depending upon the size of the target address space.
|
||||||
|
* testsuite/ld-elf/pr22450.s: New test file.
|
||||||
|
* testsuite/ld-elf/pr22450.d: New test driver.
|
||||||
|
* testsuite/config/default.exp: Add note that LD_CLASS refers to
|
||||||
|
the size of the host linker not the size of the target linker.
|
||||||
|
|
||||||
2017-11-15 Nick Clifton <nickc@redhat.com>
|
2017-11-15 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
PR 15152
|
PR 15152
|
||||||
|
|
|
@ -251,7 +251,7 @@ if ![info exists LDFLAGS] then {
|
||||||
set LDFLAGS {}
|
set LDFLAGS {}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Set LD_CLASS to "64bit" for 64-bit LD.
|
# Set LD_CLASS to "64bit" for a 64-bit *host* linker.
|
||||||
if { ![info exists LD_CLASS] } then {
|
if { ![info exists LD_CLASS] } then {
|
||||||
set REAL_LD [findfile $base_dir/.libs/ld-new .libs/ld-new $LD [transform ld]]
|
set REAL_LD [findfile $base_dir/.libs/ld-new .libs/ld-new $LD [transform ld]]
|
||||||
set readelf_output [run_host_cmd "$READELF" "-h $REAL_LD"]
|
set readelf_output [run_host_cmd "$READELF" "-h $REAL_LD"]
|
||||||
|
|
|
@ -61,6 +61,8 @@ if { [is_remote host] } then {
|
||||||
remote_download host merge.ld
|
remote_download host merge.ld
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Note - the output file from the second test (symbol3w.a) is
|
||||||
|
# used in the proc is_elf64 test below...
|
||||||
run_ld_link_tests [list \
|
run_ld_link_tests [list \
|
||||||
[list "Build symbol3.a" \
|
[list "Build symbol3.a" \
|
||||||
"" "" $hpux \
|
"" "" $hpux \
|
||||||
|
@ -70,6 +72,41 @@ run_ld_link_tests [list \
|
||||||
{symbol3w.s} {} "symbol3w.a" ] \
|
{symbol3w.s} {} "symbol3w.a" ] \
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# True if the object format is known to be 64-bit ELF.
|
||||||
|
#
|
||||||
|
proc is_elf64 { binary_file } {
|
||||||
|
global READELF
|
||||||
|
global READELFFLAGS
|
||||||
|
|
||||||
|
set readelf_size ""
|
||||||
|
catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got
|
||||||
|
|
||||||
|
if ![string match "" $got] then {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
|
||||||
|
[file_contents readelf.out] nil readelf_size] } {
|
||||||
|
verbose "FAILED to determine ELF size"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if { $readelf_size == "64" } {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if [is_elf64 tmpdir/symbol3w.a] {
|
||||||
|
set ASFLAGS "$ASFLAGS --defsym ALIGN=3"
|
||||||
|
} else {
|
||||||
|
set ASFLAGS "$ASFLAGS --defsym ALIGN=2"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Targets that use _bfd_generic_link_add_symbols won't pass pr21703 tests
|
# Targets that use _bfd_generic_link_add_symbols won't pass pr21703 tests
|
||||||
run_ld_link_tests {
|
run_ld_link_tests {
|
||||||
{"PR ld/21703"
|
{"PR ld/21703"
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#source: pr22450.s
|
||||||
|
#readelf: --notes --wide
|
||||||
|
#ld: -r
|
||||||
|
# Fails on H8300 because it does not generate the correct relocs for the size fields.
|
||||||
|
# Fails on AVR, IP2K, M68HC11, SPARC64, XC16C because the assembler does not calculate the correct values for the differences of local symbols.
|
||||||
|
# Fails on CRX because readelf does not know how to apply CRX reloc number 20 (R_CRX_SWITCH32).
|
||||||
|
|
||||||
|
#...
|
||||||
|
Displaying notes found in: \.note\.gnu
|
||||||
|
[ ]+Owner[ ]+Data size[ ]+Description
|
||||||
|
[ ]+GNU[ ]+0x0+0..[ ]+NT_GNU_PROPERTY_TYPE_0[ ]+Properties: stack size: 0x8000
|
||||||
|
#pass
|
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
.section ".note.gnu", "a" /* NB/ Deliberately incorrect section name. Should be: .note.gnu.property */
|
||||||
|
.p2align ALIGN
|
||||||
|
|
||||||
|
.dc.l 1f - 0f /* Name length. */
|
||||||
|
.dc.l 5f - 2f /* Data length. */
|
||||||
|
.dc.l 5 /* Note type: NT_GNU_PROPERTY_TYPE_0 */
|
||||||
|
0:
|
||||||
|
.asciz "GNU" /* Vendor name. */
|
||||||
|
1:
|
||||||
|
.p2align ALIGN
|
||||||
|
2:
|
||||||
|
.dc.l 1 /* pr_type: GNU_PROPERTY_STACK_SIZE */
|
||||||
|
.dc.l 5f - 4f /* pr_datasz. */
|
||||||
|
4:
|
||||||
|
.dc.a 0x8000 /* Stack size. */
|
||||||
|
5:
|
||||||
|
.p2align ALIGN
|
||||||
|
3:
|
Loading…
Reference in New Issue