652afeef24
This patch fixes a few linker crashes due to TLS code reaching an assert when it shouldn't. The first scenario is with weak TLS symbols that remain weak during linking. In this case the mid-end would not have seen a TLS symbol and so wouldn't have allocated the TLS section. We currently assert here and the linker crashes with a not very useful message. This patch changes this to return the value 0 for the TLS symbol in question emulating what lld and gold and other BFD targets do. However because weak TLS is implementation defined and we don't define any behavior for it I also emit a warning to the user to inform them of such. Secondly when a strong TLS reference is undefined. The linker crashes even after it correctly reported that there is an undefined reference. This changes it so that it gracefully exits and reports a useful error. bfd/ChangeLog: PR ld/24601 * elfnn-aarch64.c (aarch64_relocate): Handle weak TLS and undefined TLS. Also Pass input_bfd to _bfd_aarch64_elf_resolve_relocation. * elfxx-aarch64.c (_bfd_aarch64_elf_resolve_relocation): Use it. * elfxx-aarch64.h (_bfd_aarch64_elf_resolve_relocation): Emit warning for weak TLS. ld/ChangeLog: PR ld/24601 * testsuite/ld-aarch64/aarch64-elf.exp (undef-tls, weak-tls): New. * testsuite/ld-aarch64/undef-tls.d: New test. * testsuite/ld-aarch64/undef-tls.s: New test. * testsuite/ld-aarch64/weak-tls.d: New test. * testsuite/ld-aarch64/weak-tls.s: New test.
81 lines
2.6 KiB
C
81 lines
2.6 KiB
C
/* AArch64-specific backend routines.
|
|
Copyright (C) 2009-2019 Free Software Foundation, Inc.
|
|
Contributed by ARM Ltd.
|
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
|
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; see the file COPYING3. If not,
|
|
see <http://www.gnu.org/licenses/>. */
|
|
|
|
/* Take the PAGE component of an address or offset. */
|
|
#define PG(x) ((x) & ~ (bfd_vma) 0xfff)
|
|
#define PG_OFFSET(x) ((x) & (bfd_vma) 0xfff)
|
|
|
|
#define AARCH64_ADR_OP 0x10000000
|
|
#define AARCH64_ADRP_OP 0x90000000
|
|
#define AARCH64_ADRP_OP_MASK 0x9F000000
|
|
|
|
extern bfd_signed_vma
|
|
_bfd_aarch64_sign_extend (bfd_vma, int);
|
|
|
|
extern uint32_t
|
|
_bfd_aarch64_decode_adrp_imm (uint32_t);
|
|
|
|
extern uint32_t
|
|
_bfd_aarch64_reencode_adr_imm (uint32_t, uint32_t);
|
|
|
|
extern bfd_reloc_status_type
|
|
_bfd_aarch64_elf_put_addend (bfd *, bfd_byte *, bfd_reloc_code_real_type,
|
|
reloc_howto_type *, bfd_signed_vma);
|
|
|
|
extern bfd_vma
|
|
_bfd_aarch64_elf_resolve_relocation (bfd *, bfd_reloc_code_real_type, bfd_vma,
|
|
bfd_vma, bfd_vma, bfd_boolean);
|
|
|
|
extern bfd_boolean
|
|
_bfd_aarch64_elf_grok_prstatus (bfd *, Elf_Internal_Note *);
|
|
|
|
extern bfd_boolean
|
|
_bfd_aarch64_elf_grok_psinfo (bfd *, Elf_Internal_Note *);
|
|
|
|
extern char *
|
|
_bfd_aarch64_elf_write_core_note (bfd *, char *, int *, int, ...);
|
|
|
|
#define elf_backend_grok_prstatus _bfd_aarch64_elf_grok_prstatus
|
|
#define elf_backend_grok_psinfo _bfd_aarch64_elf_grok_psinfo
|
|
#define elf_backend_write_core_note _bfd_aarch64_elf_write_core_note
|
|
|
|
extern bfd *
|
|
_bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *,
|
|
uint32_t *);
|
|
|
|
extern enum elf_property_kind
|
|
_bfd_aarch64_elf_parse_gnu_properties (bfd *, unsigned int,
|
|
bfd_byte *, unsigned int);
|
|
|
|
extern bfd_boolean
|
|
_bfd_aarch64_elf_merge_gnu_properties (struct bfd_link_info *, bfd *,
|
|
elf_property *, elf_property *,
|
|
uint32_t);
|
|
|
|
extern void
|
|
_bfd_aarch64_elf_link_fixup_gnu_properties (struct bfd_link_info *,
|
|
elf_property_list **);
|
|
|
|
#define elf_backend_parse_gnu_properties \
|
|
_bfd_aarch64_elf_parse_gnu_properties
|
|
|
|
#define elf_backend_fixup_gnu_properties \
|
|
_bfd_aarch64_elf_link_fixup_gnu_properties
|