/* BFD back-end for IBM RS/6000 "XCOFF64" files.
- Copyright (C) 2000-2018 Free Software Foundation, Inc.
+ Copyright (C) 2000-2021 Free Software Foundation, Inc.
Written Clinton Popetz.
Contributed by Cygnus Support.
asection **);
static bfd_boolean xcoff64_slurp_armap
(bfd *);
-static const bfd_target *xcoff64_archive_p
+static bfd_cleanup xcoff64_archive_p
(bfd *);
static bfd *xcoff64_openr_next_archived_file
(bfd *, bfd *);
(bfd *, void *);
/* Relocation functions */
-static bfd_boolean xcoff64_reloc_type_br
- (XCOFF_RELOC_FUNCTION_ARGS);
+static xcoff_reloc_function xcoff64_reloc_type_br;
-bfd_boolean (*xcoff64_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION])
- (XCOFF_RELOC_FUNCTION_ARGS) =
+xcoff_reloc_function *const
+xcoff64_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION] =
{
xcoff_reloc_type_pos, /* R_POS (0x00) */
xcoff_reloc_type_neg, /* R_NEG (0x01) */
#define coff_bfd_reloc_type_lookup xcoff64_reloc_type_lookup
#define coff_bfd_reloc_name_lookup xcoff64_reloc_name_lookup
#ifdef AIX_CORE
-extern const bfd_target * rs6000coff_core_p
+extern bfd_cleanup rs6000coff_core_p
(bfd *abfd);
extern bfd_boolean rs6000coff_core_file_matches_executable_p
(bfd *cbfd, bfd *ebfd);
#define bfd_pe_print_pdata NULL
#endif
-#include <stdint.h>
#include "coffcode.h"
/* For XCOFF64, the effective width of symndx changes depending on
if (text_sec != NULL)
{
internal_a.o_sntext = text_sec->target_index;
- internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
+ internal_a.o_algntext = bfd_section_alignment (text_sec);
}
else
{
if (data_sec != NULL)
{
internal_a.o_sndata = data_sec->target_index;
- internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
+ internal_a.o_algndata = bfd_section_alignment (data_sec);
}
else
{
{
if (info->unresolved_syms_in_objects != RM_IGNORE
&& (h->flags & XCOFF_WAS_UNDEFINED) != 0)
- (*info->callbacks->undefined_symbol)
+ info->callbacks->undefined_symbol
(info, h->root.root.string, input_bfd, input_section,
rel->r_vaddr - input_section->vma,
- info->unresolved_syms_in_objects == RM_GENERATE_ERROR);
+ info->unresolved_syms_in_objects == RM_DIAGNOSE
+ && !info->warn_unresolved_syms);
if (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
operation, which would be tedious, or we must do the computations
in a type larger than bfd_vma, which would be inefficient. */
- if ((unsigned int) howto.complain_on_overflow
- >= XCOFF_MAX_COMPLAIN_OVERFLOW)
- abort ();
-
if (((*xcoff_complain_overflow[howto.complain_on_overflow])
(input_bfd, value_to_relocate, relocation, &howto)))
{
}
/* Macro to read an ASCII value stored in an archive header field. */
-#define GET_VALUE_IN_FIELD(VAR, FIELD) \
- do \
- { \
- (VAR) = sizeof (VAR) > sizeof (long) \
- ? _bfd_strntoll (FIELD, 10, sizeof FIELD) \
- : _bfd_strntol (FIELD, 10, sizeof FIELD); \
- } \
+#define GET_VALUE_IN_FIELD(VAR, FIELD, BASE) \
+ do \
+ { \
+ (VAR) = (sizeof (VAR) > sizeof (long) \
+ ? _bfd_strntoll (FIELD, BASE, sizeof FIELD) \
+ : _bfd_strntol (FIELD, BASE, sizeof FIELD)); \
+ } \
while (0)
/* Read in the armap of an XCOFF archive. */
if (xcoff_ardata (abfd) == NULL)
{
- bfd_has_map (abfd) = FALSE;
+ abfd->has_armap = FALSE;
return TRUE;
}
(const char **) NULL, 10);
if (off == 0)
{
- bfd_has_map (abfd) = FALSE;
+ abfd->has_armap = FALSE;
return TRUE;
}
return FALSE;
/* Skip the name (normally empty). */
- GET_VALUE_IN_FIELD (namlen, hdr.namlen);
+ GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
pos = ((namlen + 1) & ~(size_t) 1) + SXCOFFARFMAG;
if (bfd_seek (abfd, pos, SEEK_CUR) != 0)
return FALSE;
sz = bfd_scan_vma (hdr.size, (const char **) NULL, 10);
+ if (sz + 1 < 9)
+ {
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
/* Read in the entire symbol table. */
- contents = (bfd_byte *) bfd_alloc (abfd, sz);
+ contents = (bfd_byte *) _bfd_alloc_and_read (abfd, sz + 1, sz);
if (contents == NULL)
return FALSE;
- if (bfd_bread (contents, sz, abfd) != sz)
- return FALSE;
+
+ /* Ensure strings are NULL terminated so we don't wander off the end
+ of the buffer. */
+ contents[sz] = 0;
/* The symbol table starts with an eight byte count. */
c = H_GET_64 (abfd, contents);
- if (c * 8 >= sz)
+ if (c >= sz / 8)
{
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
bfd_ardata (abfd)->symdef_count = c;
- bfd_has_map (abfd) = TRUE;
+ abfd->has_armap = TRUE;
return TRUE;
}
/* See if this is an NEW XCOFF archive. */
-static const bfd_target *
+static bfd_cleanup
xcoff64_archive_p (bfd *abfd)
{
struct artdata *tdata_hold;
char magic[SXCOFFARMAG];
/* This is the new format. */
struct xcoff_ar_file_hdr_big hdr;
- bfd_size_type amt = SXCOFFARMAG;
+ size_t amt = SXCOFFARMAG;
if (bfd_bread (magic, amt, abfd) != amt)
{
return NULL;
}
- return abfd->xvec;
+ return _bfd_no_cleanup;
}
MINUS_ONE, /* dst_mask */
FALSE); /* pcrel_offset */
-static unsigned long xcoff64_glink_code[10] =
+static const unsigned long xcoff64_glink_code[10] =
{
0xe9820000, /* ld r12,0(r2) */
0xf8410028, /* std r2,40(r1) */
'/', /* ar_pad_char */
15, /* ar_max_namelen */
0, /* match priority. */
+ TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */
/* data */
bfd_getb64,
bfd_generic_lookup_section_flags,
bfd_generic_merge_sections,
bfd_generic_is_group_section,
+ bfd_generic_group_name,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
_bfd_xcoff_define_common_symbol,
&bfd_xcoff_backend_data,
};
-extern const bfd_target *xcoff64_core_p
+extern bfd_cleanup xcoff64_core_p
(bfd *);
extern bfd_boolean xcoff64_core_file_matches_executable_p
(bfd *, bfd *);
'/', /* ar_pad_char */
15, /* ar_max_namelen */
0, /* match priority. */
+ TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */
/* data */
bfd_getb64,
bfd_generic_lookup_section_flags,
bfd_generic_merge_sections,
bfd_generic_is_group_section,
+ bfd_generic_group_name,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
_bfd_xcoff_define_common_symbol,