/* Renesas RL78 specific support for 32-bit ELF.
- Copyright (C) 2011-2015 Free Software Foundation, Inc.
+ Copyright (C) 2011-2017 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
r_type = ELF32_R_TYPE (dst->r_info);
if (r_type >= (unsigned int) R_RL78_max)
{
+ /* xgettext:c-format */
_bfd_error_handler (_("%B: invalid RL78 reloc number: %d"), abfd, r_type);
r_type = 0;
}
\f
static bfd_vma
get_symbol_value (const char * name,
- bfd_reloc_status_type * status,
struct bfd_link_info * info,
bfd * input_bfd,
asection * input_section,
|| (h->type != bfd_link_hash_defined
&& h->type != bfd_link_hash_defweak))
{
- bfd_reloc_status_type res;
-
- res = info->callbacks->undefined_symbol
+ (*info->callbacks->undefined_symbol)
(info, name, input_bfd, input_section, offset, TRUE);
- if (status)
- * status = res;
return 0;
}
}
static bfd_vma
-get_romstart (bfd_reloc_status_type * status,
- struct bfd_link_info * info,
+get_romstart (struct bfd_link_info * info,
bfd * abfd,
asection * sec,
int offset)
{
static bfd_boolean cached = FALSE;
static bfd_vma cached_value = 0;
- static bfd_reloc_status_type cached_status;
if (!cached)
{
- cached_value = get_symbol_value ("_start", & cached_status, info, abfd, sec, offset);
+ cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
cached = TRUE;
}
- if (status)
- * status = cached_status;
return cached_value;
}
static bfd_vma
-get_ramstart (bfd_reloc_status_type * status,
- struct bfd_link_info * info,
+get_ramstart (struct bfd_link_info * info,
bfd * abfd,
asection * sec,
int offset)
{
static bfd_boolean cached = FALSE;
static bfd_vma cached_value = 0;
- static bfd_reloc_status_type cached_status;
if (!cached)
{
- cached_value = get_symbol_value ("__datastart", & cached_status, info, abfd, sec, offset);
+ cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
cached = TRUE;
}
- if (status)
- * status = cached_status;
return cached_value;
}
break;
case R_RL78_OPromtop:
- relocation = get_romstart (&r, NULL, input_bfd, input_section,
+ relocation = get_romstart (NULL, input_bfd, input_section,
reloc->address);
break;
case R_RL78_OPramtop:
- relocation = get_ramstart (&r, NULL, input_bfd, input_section,
+ relocation = get_ramstart (NULL, input_bfd, input_section,
reloc->address);
break;
}
struct elf_link_hash_entry ** sym_hashes;
Elf_Internal_Rela * rel;
Elf_Internal_Rela * relend;
- bfd *dynobj;
asection *splt;
symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
sym_hashes = elf_sym_hashes (input_bfd);
relend = relocs + input_section->reloc_count;
- dynobj = elf_hash_table (info)->dynobj;
- splt = NULL;
- if (dynobj != NULL)
- splt = bfd_get_linker_section (dynobj, ".plt");
+ splt = elf_hash_table (info)->splt;
for (rel = relocs; rel < relend; rel ++)
{
break;
case R_RL78_OPromtop:
- relocation = get_romstart (&r, info, input_bfd, input_section, rel->r_offset);
+ relocation = get_romstart (info, input_bfd, input_section, rel->r_offset);
(void) rl78_compute_complex_reloc (r_type, relocation, input_section);
break;
case R_RL78_OPramtop:
- relocation = get_ramstart (&r, info, input_bfd, input_section, rel->r_offset);
+ relocation = get_ramstart (info, input_bfd, input_section, rel->r_offset);
(void) rl78_compute_complex_reloc (r_type, relocation, input_section);
break;
/* Catch the case of a missing function declaration
and emit a more helpful error message. */
if (r_type == R_RL78_DIR24S_PCREL)
+ /* xgettext:c-format */
msg = _("%B(%A): error: call to undefined function '%s'");
else
- r = info->callbacks->reloc_overflow
+ (*info->callbacks->reloc_overflow)
(info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
input_bfd, input_section, rel->r_offset);
break;
case bfd_reloc_undefined:
- r = info->callbacks->undefined_symbol
- (info, name, input_bfd, input_section, rel->r_offset,
- TRUE);
+ (*info->callbacks->undefined_symbol)
+ (info, name, input_bfd, input_section, rel->r_offset, TRUE);
break;
case bfd_reloc_other:
+ /* xgettext:c-format */
msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
break;
case bfd_reloc_outofrange:
+ /* xgettext:c-format */
msg = _("%B(%A): internal error: out of range error");
break;
case bfd_reloc_notsupported:
+ /* xgettext:c-format */
msg = _("%B(%A): internal error: unsupported relocation error");
break;
case bfd_reloc_dangerous:
+ /* xgettext:c-format */
msg = _("%B(%A): internal error: dangerous relocation");
break;
default:
+ /* xgettext:c-format */
msg = _("%B(%A): internal error: unknown error");
break;
}
if (msg)
_bfd_error_handler (msg, input_bfd, input_section, name);
-
- if (! r)
- return FALSE;
}
}
object file when linking. */
static bfd_boolean
-rl78_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
+rl78_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
{
+ bfd *obfd = info->output_bfd;
flagword new_flags;
flagword old_flags;
bfd_boolean error = FALSE;
but that is still incompatible with the G10 ABI. */
error = TRUE;
- (*_bfd_error_handler)
+ _bfd_error_handler
+ /* xgettext:c-format */
(_("RL78 ABI conflict: G10 file %s cannot be linked with %s file %s"),
bfd_get_filename (ibfd),
rl78_cpu_name (out_cpu), bfd_get_filename (obfd));
{
error = TRUE;
- (*_bfd_error_handler)
+ _bfd_error_handler
+ /* xgettext:c-format */
(_("RL78 ABI conflict: cannot link %s file %s with %s file %s"),
rl78_cpu_name (in_cpu), bfd_get_filename (ibfd),
rl78_cpu_name (out_cpu), bfd_get_filename (obfd));
if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
{
- (*_bfd_error_handler)
+ _bfd_error_handler
(_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
- (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
- bfd_get_filename (obfd), bfd_get_filename (ibfd));
+ /* xgettext:c-format */
+ _bfd_error_handler (_("- %s is 64-bit, %s is not"),
+ bfd_get_filename (obfd), bfd_get_filename (ibfd));
else
- (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
- bfd_get_filename (ibfd), bfd_get_filename (obfd));
+ /* xgettext:c-format */
+ _bfd_error_handler (_("- %s is 64-bit, %s is not"),
+ bfd_get_filename (ibfd), bfd_get_filename (obfd));
error = TRUE;
}
}
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
sym_hashes = elf_sym_hashes (abfd);
local_plt_offsets = elf_local_got_offsets (abfd);
- splt = NULL;
dynobj = elf_hash_table(info)->dynobj;
rel_end = relocs + sec->reloc_count;
case R_RL78_DIR16S:
if (dynobj == NULL)
elf_hash_table (info)->dynobj = dynobj = abfd;
+ splt = elf_hash_table (info)->splt;
if (splt == NULL)
{
- splt = bfd_get_linker_section (dynobj, ".plt");
- if (splt == NULL)
- {
- flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY | SEC_LINKER_CREATED
- | SEC_READONLY | SEC_CODE);
- splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
- flags);
- if (splt == NULL
- || ! bfd_set_section_alignment (dynobj, splt, 1))
- return FALSE;
- }
+ flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
+ | SEC_IN_MEMORY | SEC_LINKER_CREATED
+ | SEC_READONLY | SEC_CODE);
+ splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
+ flags);
+ elf_hash_table (info)->splt = splt;
+ if (splt == NULL
+ || ! bfd_set_section_alignment (dynobj, splt, 1))
+ return FALSE;
}
if (h != NULL)
if (info->relax_trip > 0)
return TRUE;
- if ((dynobj = elf_hash_table (info)->dynobj) != NULL
- && (splt = bfd_get_linker_section (dynobj, ".plt")) != NULL)
+ dynobj = elf_hash_table (info)->dynobj;
+ splt = elf_hash_table (info)->splt;
+ if (dynobj != NULL && splt != NULL)
{
bfd_byte *contents = splt->contents;
unsigned int i, size = splt->size;
if (dynobj == NULL)
return TRUE;
- splt = bfd_get_linker_section (dynobj, ".plt");
+ splt = elf_hash_table (info)->splt;
BFD_ASSERT (splt != NULL);
splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
break;
case R_RL78_OPromtop:
- symval = get_romstart (NULL, info, input_bfd, input_section, rel->r_offset);
+ symval = get_romstart (info, input_bfd, input_section, rel->r_offset);
(void) rl78_compute_complex_reloc (r_type, symval, input_section);
break;
case R_RL78_OPramtop:
- symval = get_ramstart (NULL, info, input_bfd, input_section, rel->r_offset);
+ symval = get_ramstart (info, input_bfd, input_section, rel->r_offset);
(void) rl78_compute_complex_reloc (r_type, symval, input_section);
break;
default:
reloc_computes_value:
symval = rl78_compute_complex_reloc (r_type, symval, input_section);
+ /* Fall through. */
case R_RL78_DIR32:
case R_RL78_DIR24S:
case R_RL78_DIR16: