/* bfd back-end for HP PA-RISC SOM objects.
- Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
- Free Software Foundation, Inc.
+ Copyright (C) 1990-2016 Free Software Foundation, Inc.
Contributed by the Center for Software Science at the
University of Utah.
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
-#include "alloca-conf.h"
#include "sysdep.h"
+#include "alloca-conf.h"
#include "bfd.h"
-
+#include "libiberty.h"
#include "libbfd.h"
#include "som.h"
#include "safe-ctype.h"
{
struct som_external_exec_auxhdr ext_exec_auxhdr;
- aux_hdr_ptr = bfd_zalloc (abfd,
+ aux_hdr_ptr = bfd_zalloc (abfd,
(bfd_size_type) sizeof (*aux_hdr_ptr));
if (aux_hdr_ptr == NULL)
return NULL;
/* Chunk of memory that we can use as buffer space, then throw
away. */
size_t tmp_space_size = SOM_TMP_BUFSIZE;
- char *tmp_space = alloca (tmp_space_size);
+ char *tmp_space = xmalloc (tmp_space_size);
char *p = tmp_space;
unsigned int strings_size = 0;
asection *section;
bfd_size_type amt;
+ bfd_size_type res;
/* Seek to the start of the space strings in preparation for writing
them out. */
tmp_space_size = length + 5;
else
tmp_space_size = 2 * tmp_space_size;
- tmp_space = alloca (tmp_space_size);
+ tmp_space = xrealloc (tmp_space, tmp_space_size);
}
/* Reset to beginning of the (possibly new) buffer space. */
/* Done with the space/subspace strings. Write out any information
contained in a partial block. */
amt = p - tmp_space;
- if (bfd_bwrite ((void *) &tmp_space[0], amt, abfd) != amt)
+ res = bfd_bwrite ((void *) &tmp_space[0], amt, abfd);
+ free (tmp_space);
+ if (res != amt)
return FALSE;
*string_sizep = strings_size;
return TRUE;
struct som_compilation_unit *compilation_unit)
{
unsigned int i;
-
/* Chunk of memory that we can use as buffer space, then throw
away. */
size_t tmp_space_size = SOM_TMP_BUFSIZE;
- char *tmp_space = alloca (tmp_space_size);
+ char *tmp_space = xmalloc (tmp_space_size);
char *p = tmp_space;
-
unsigned int strings_size = 0;
bfd_size_type amt;
+ bfd_size_type res;
/* This gets a bit gruesome because of the compilation unit. The
strings within the compilation unit are part of the symbol
tmp_space_size = 5 + length;
else
tmp_space_size = 2 * tmp_space_size;
- tmp_space = alloca (tmp_space_size);
+ tmp_space = xrealloc (tmp_space, tmp_space_size);
}
/* Reset to beginning of the (possibly new) buffer
tmp_space_size = 5 + length;
else
tmp_space_size = 2 * tmp_space_size;
- tmp_space = alloca (tmp_space_size);
+ tmp_space = xrealloc (tmp_space, tmp_space_size);
}
/* Reset to beginning of the (possibly new) buffer space. */
/* Scribble out any partial block. */
amt = p - tmp_space;
- if (bfd_bwrite ((void *) &tmp_space[0], amt, abfd) != amt)
+ res = bfd_bwrite ((void *) &tmp_space[0], amt, abfd);
+ free (tmp_space);
+ if (res != amt)
return FALSE;
*string_sizep = strings_size;
/* Convert from a SOM subspace index to a BFD section. */
-static asection *
+asection *
bfd_section_from_som_symbol
(bfd *abfd, struct som_external_symbol_dictionary_record *symbol)
{
return section->reloc_count;
}
-extern const bfd_target som_vec;
+extern const bfd_target hppa_som_vec;
/* A hook to set up object file dependent section information. */
static bfd_boolean
som_find_nearest_line (bfd *abfd,
- asection *section,
asymbol **symbols,
+ asection *section,
bfd_vma offset,
const char **filename_ptr,
const char **functionname_ptr,
- unsigned int *line_ptr)
+ unsigned int *line_ptr,
+ unsigned int *discriminator_ptr)
{
bfd_boolean found;
asymbol *func;
bfd_vma low_func;
asymbol **p;
+ if (discriminator_ptr)
+ *discriminator_ptr = 0;
+
if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
& found, filename_ptr,
functionname_ptr, line_ptr,
low_func = 0;
for (p = symbols; *p != NULL; p++)
- {
+ {
som_symbol_type *q = (som_symbol_type *) *p;
-
+
if (q->som_type == SYMBOL_TYPE_ENTRY
&& q->symbol.section == section
&& q->symbol.value >= low_func
struct bfd_link_info *info ATTRIBUTE_UNUSED)
{
(*_bfd_error_handler) (_("som_sizeof_headers unimplemented"));
- fflush (stderr);
abort ();
return 0;
}
struct som_external_lst_header lst,
unsigned elength)
{
- file_ptr lst_filepos;
char *strings = NULL, *p;
struct som_external_lst_symbol_record *lst_syms = NULL, *curr_lst_sym;
bfd *curr_bfd;
if (last_hash_entry == NULL && hash_size != 0)
goto error_return;
- /* Lots of fields are file positions relative to the start
- of the lst record. So save its location. */
- lst_filepos = bfd_tell (abfd) - sizeof (struct som_external_lst_header);
-
/* Symbols have som_index fields, so we have to keep track of the
index of each SOM in the archive.
return som_is_subspace (sec) && sec->size > 240000;
}
+#define som_find_line _bfd_nosymbols_find_line
+#define som_get_symbol_version_string _bfd_nosymbols_get_symbol_version_string
#define som_close_and_cleanup som_bfd_free_cached_info
#define som_read_ar_hdr _bfd_generic_read_ar_hdr
#define som_write_ar_hdr _bfd_generic_write_ar_hdr
#define som_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
#define som_bfd_relax_section bfd_generic_relax_section
#define som_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
-#define som_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
#define som_bfd_link_add_symbols _bfd_generic_link_add_symbols
#define som_bfd_link_just_syms _bfd_generic_link_just_syms
#define som_bfd_copy_link_hash_symbol_type \
_bfd_generic_copy_link_hash_symbol_type
#define som_bfd_final_link _bfd_generic_final_link
#define som_bfd_gc_sections bfd_generic_gc_sections
+#define som_bfd_lookup_section_flags bfd_generic_lookup_section_flags
#define som_bfd_merge_sections bfd_generic_merge_sections
#define som_bfd_is_group_section bfd_generic_is_group_section
#define som_bfd_discard_group bfd_generic_discard_group
#define som_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
#define som_find_inliner_info _bfd_nosymbols_find_inliner_info
-const bfd_target som_vec =
+const bfd_target hppa_som_vec =
{
"som", /* Name. */
bfd_target_som_flavour,
0,
'/', /* AR_pad_char. */
14, /* AR_max_namelen. */
+ 0, /* match priority. */
bfd_getb64, bfd_getb_signed_64, bfd_putb64,
bfd_getb32, bfd_getb_signed_32, bfd_putb32,
bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */