[Bug 221107] -r322109 and -r322210 (so clang 5) TARGET_ARCH=powerpc agp.kld or agp.kld gets: R_PPC_PLTREL24 reloc against local symbol; could not read symbols: Bad value
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Fri Aug 11 01:02:23 UTC 2017
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=221107
--- Comment #4 from Mark Millard <markmi at dsl-only.net> ---
The "reloc against local symbol" text
is omitted by code from:
/usr/src/contrib/binutils/bfd/elf32-ppc.c
in its routine:
/* Look through the relocs for a section during the first phase, and
allocate space in the global offset table or procedure linkage
table. */
static bfd_boolean
ppc_elf_check_relocs (bfd *abfd,
struct bfd_link_info *info,
asection *sec,
const Elf_Internal_Rela *relocs)
via:
tls_type = 0;
r_type = ELF32_R_TYPE (rel->r_info);
. . .
switch (r_type)
{
. . .
case R_PPC_PLT32:
case R_PPC_PLTREL24:
case R_PPC_PLTREL32:
case R_PPC_PLT16_LO:
case R_PPC_PLT16_HI:
case R_PPC_PLT16_HA:
#ifdef DEBUG
fprintf (stderr, "Reloc requires a PLT entry\n");
#endif
/* This symbol requires a procedure linkage table entry. We
actually build the entry in finish_dynamic_symbol,
because this might be a case of linking PIC code without
linking in any dynamic objects, in which case we don't
need to generate a procedure linkage table after all. */
if (h == NULL)
{
/* It does not make sense to have a procedure linkage
table entry for a local symbol. */
(*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
"local symbol"),
abfd,
sec,
(long) rel->r_offset,
ppc_elf_howto_table[r_type]->name);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
else
{
bfd_vma addend = 0;
if (r_type == R_PPC_PLTREL24)
{
ppc_elf_tdata (abfd)->makes_plt_call = 1;
addend = rel->r_addend;
}
h->needs_plt = 1;
if (!update_plt_info (abfd, h, got2, addend))
return FALSE;
}
break;
where the earlier code for finding the h value is:
r_symndx = ELF32_R_SYM (rel->r_info);
if (r_symndx < symtab_hdr->sh_info)
h = NULL;
else
{
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
while (h->root.type == bfd_link_hash_indirect
|| h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
}
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list