/* 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
+ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009
Free Software Foundation, Inc.
Contributed by the Center for Software Science at the
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
+#include "alloca-conf.h"
#include "sysdep.h"
#include "bfd.h"
#include <machine/reg.h>
#include <sys/file.h>
-/* This is the code recommended in the autoconf documentation, almost
- verbatim. */
-
-#ifndef __GNUC__
-# if HAVE_ALLOCA_H
-# include <alloca.h>
-# else
-# ifdef _AIX
-/* Indented so that pre-ansi C compilers will ignore it, rather than
- choke on it. Some versions of AIX require this to be the first
- thing in the file. */
- #pragma alloca
-# else
-# ifndef alloca /* predefined by HP cc +Olibcalls */
-# if !defined (__STDC__) && !defined (__hpux)
-extern char *alloca ();
-# else
-extern void *alloca ();
-# endif /* __STDC__, __hpux */
-# endif /* alloca */
-# endif /* _AIX */
-# endif /* HAVE_ALLOCA_H */
-#endif /* __GNUC__ */
-
static bfd_reloc_status_type hppa_som_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
static bfd_boolean som_mkobject (bfd *);
/* R_DATA_ONE_SYMBOL. */
{ 0, "L4=Sb=" }, /* 0x25 */
{ 1, "L4=Sd=" }, /* 0x26 */
- /* R_DATA_PLEBEL. */
+ /* R_DATA_PLABEL. */
{ 0, "L4=Sb=" }, /* 0x27 */
{ 1, "L4=Sd=" }, /* 0x28 */
/* R_SPACE_REF. */
{ 31, "L4=SD=" }, /* 0x6f */
{ 32, "L4=Sb=" }, /* 0x70 */
{ 33, "L4=Sd=" }, /* 0x71 */
+ /* R_DATA_GPREL. */
+ { 0, "L4=Sd=" }, /* 0x72 */
/* R_RESERVED. */
- { 0, "" }, /* 0x72 */
{ 0, "" }, /* 0x73 */
{ 0, "" }, /* 0x74 */
{ 0, "" }, /* 0x75 */
SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
- SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),
+ SOM_HOWTO (R_DATA_GPREL, "R_DATA_GPREL"),
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
|| field == e_lpsel
|| field == e_rpsel)
*final_type = R_DATA_PLABEL;
+ else if (field == e_fsel && format == 32)
+ *final_type = R_DATA_GPREL;
break;
case R_HPPA_COMPLEX:
abort ();
break;
+ case R_DATA_GPREL:
+ /* Account for any addend. */
+ if (bfd_reloc->addend)
+ p = som_reloc_addend (abfd, bfd_reloc->addend, p,
+ &subspace_reloc_size, reloc_queue);
+
+ if (sym_num < 0x10000000)
+ {
+ bfd_put_8 (abfd, bfd_reloc->howto->type, p);
+ bfd_put_8 (abfd, sym_num >> 16, p + 1);
+ bfd_put_16 (abfd, (bfd_vma) sym_num, p + 2);
+ p = try_prev_fixup (abfd, &subspace_reloc_size,
+ p, 4, reloc_queue);
+ }
+ else
+ abort ();
+ break;
+
case R_DATA_ONE_SYMBOL:
case R_DATA_PLABEL:
case R_CODE_PLABEL:
section (ST_DATA for DATA sections, ST_CODE for CODE sections). */
else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_UNKNOWN)
{
- if (sym->section->flags & SEC_CODE)
+ if (bfd_is_abs_section (sym->section))
+ info->symbol_type = ST_ABSOLUTE;
+ else if (sym->section->flags & SEC_CODE)
info->symbol_type = ST_CODE;
else
info->symbol_type = ST_DATA;
#define som_bfd_is_group_section bfd_generic_is_group_section
#define som_bfd_discard_group bfd_generic_discard_group
#define som_section_already_linked _bfd_generic_section_already_linked
+#define som_bfd_define_common_symbol bfd_generic_define_common_symbol
#define som_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
#define som_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
#define som_bfd_set_private_flags _bfd_generic_bfd_set_private_flags