diff --git a/ld/ChangeLog b/ld/ChangeLog index b8e7677e10..bd56f95c67 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2020-07-23 Maciej W. Rozycki + + PR ld/26288 + * ldelf.c (ldelf_after_open): Do not reject ET_EXEC input + supplied with `--just-symbols'. + * testsuite/ld-misc/just-symbols.exp: New test script. + * testsuite/ld-misc/just-symbols-1.dd: New test dump. + * testsuite/ld-misc/just-symbols.ld: New test linker script. + * testsuite/ld-misc/just-symbols-0.s: New test source. + * testsuite/ld-misc/just-symbols-1.s: New test source. + 2020-07-23 Maciej W. Rozycki PR ld/26288 diff --git a/ld/ldelf.c b/ld/ldelf.c index 1c51a57226..bada3ade2d 100644 --- a/ld/ldelf.c +++ b/ld/ldelf.c @@ -1043,7 +1043,8 @@ ldelf_after_open (int use_libpath, int native, int is_linux, int is_freebsd, /* Do not allow executable files to be used as inputs to the link. */ for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next) { - if (elf_tdata (abfd) != NULL + if (!bfd_input_just_syms (abfd) + && elf_tdata (abfd) != NULL && elf_tdata (abfd)->elf_header != NULL /* FIXME: Maybe check for other non-supportable types as well ? */ && elf_tdata (abfd)->elf_header->e_type == ET_EXEC) diff --git a/ld/testsuite/ld-misc/just-symbols-0.s b/ld/testsuite/ld-misc/just-symbols-0.s new file mode 100644 index 0000000000..bceb6ba706 --- /dev/null +++ b/ld/testsuite/ld-misc/just-symbols-0.s @@ -0,0 +1,4 @@ + .data + .org 0x12 + .globl foo +foo: diff --git a/ld/testsuite/ld-misc/just-symbols-1.dd b/ld/testsuite/ld-misc/just-symbols-1.dd new file mode 100644 index 0000000000..8908a235ae --- /dev/null +++ b/ld/testsuite/ld-misc/just-symbols-1.dd @@ -0,0 +1,5 @@ +.*: +file format .* + +Contents of section \.data: + [0-9a-f]+ (?:(:?12000000|00120000|00000012) 0{8}|0{8} 00000012) 0{8} 0{8} .* +#pass diff --git a/ld/testsuite/ld-misc/just-symbols-1.s b/ld/testsuite/ld-misc/just-symbols-1.s new file mode 100644 index 0000000000..975d08337b --- /dev/null +++ b/ld/testsuite/ld-misc/just-symbols-1.s @@ -0,0 +1,4 @@ + .data +bar: + .dc.a foo + .org 0x10 diff --git a/ld/testsuite/ld-misc/just-symbols.exp b/ld/testsuite/ld-misc/just-symbols.exp new file mode 100644 index 0000000000..1c1f866b73 --- /dev/null +++ b/ld/testsuite/ld-misc/just-symbols.exp @@ -0,0 +1,57 @@ +# Expect script for ld --just-symbols tests. +# Copyright (C) 2020 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. +# + +# SH/PE targets complain about zero VMA. +# x86_64/PE targets hardcode VMA to 0x100000000. +if { [istarget sh-*-pe] \ + || [istarget x86_64-*-cygwin] \ + || [istarget x86_64-*-mingw*] \ + || [istarget x86_64-*-pe] \ + || [istarget x86_64-*-pep] } { + return +} + +run_ld_link_tests { + {"Object for --just-symbols test" + "-r -T just-symbols.ld" "" + "" + {just-symbols-0.s} + {} + "just-symbols-0.o"} + {"Executable for --just-symbols test" + "-e 0 -T just-symbols.ld" "" + "" + {just-symbols-0.s} + {} + "just-symbols-0"} + {"Object with --just-symbols test" + "-e 0 -T just-symbols.ld --just-symbols=tmpdir/just-symbols-0.o" "" + "" + {just-symbols-1.s} + {{objdump {-s -j .data} just-symbols-1.dd}} + "just-symbols-1obj"} + {"Executable with --just-symbols test" + "-e 0 -T just-symbols.ld --just-symbols=tmpdir/just-symbols-0" "" + "" + {just-symbols-1.s} + {{objdump {-s -j .data} just-symbols-1.dd}} + "just-symbols-1exe"} +} diff --git a/ld/testsuite/ld-misc/just-symbols.ld b/ld/testsuite/ld-misc/just-symbols.ld new file mode 100644 index 0000000000..3d6598757a --- /dev/null +++ b/ld/testsuite/ld-misc/just-symbols.ld @@ -0,0 +1,7 @@ +SECTIONS +{ + .text : { *(.text) } + .data : { *(.data) } + .bss : { *(.bss) } + /DISCARD/ : { *(*) } +}