/* ELF object file format.
- Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1992-2020 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
+ the Free Software Foundation; either version 3, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
#define OUTPUT_FLAVOR bfd_target_elf_flavour
#endif
-#include "bfd.h"
-
#define BYTES_IN_WORD 4 /* for now */
#include "bfd/elf-bfd.h"
#endif
#endif
+enum elf_visibility
+{
+ visibility_unchanged = 0,
+ visibility_local,
+ visibility_hidden,
+ visibility_remove
+};
+
+struct elf_versioned_name_list
+{
+ char *name;
+ struct elf_versioned_name_list *next;
+};
+
/* Additional information we keep for each symbol. */
struct elf_obj_sy
{
/* Whether the symbol has been marked as local. */
- int local;
+ unsigned int local : 1;
+
+ /* Whether the symbol has been marked for rename with @@@. */
+ unsigned int rename : 1;
+
+ /* Whether the symbol has a bad version name. */
+ unsigned int bad_version : 1;
+
+ /* Whether visibility of the symbol should be changed. */
+ ENUM_BITFIELD (elf_visibility) visibility : 2;
/* Use this to keep track of .size expressions that involve
differences that we can't compute yet. */
expressionS *size;
- /* The name specified by the .symver directive. */
- char *versioned_name;
+ /* The list of names specified by the .symver directive. */
+ struct elf_versioned_name_list *versioned_name;
#ifdef ECOFF_DEBUGGING
/* If we are generating ECOFF debugging information, we need some
#endif
};
-#define OBJ_SYMFIELD_TYPE struct elf_obj_sy
-
-/* Symbol fields used by the ELF back end. */
-#define ELF_TARGET_SYMBOL_FIELDS unsigned int local:1;
-
-/* Don't change this; change ELF_TARGET_SYMBOL_FIELDS instead. */
-#ifndef TARGET_SYMBOL_FIELDS
-#define TARGET_SYMBOL_FIELDS ELF_TARGET_SYMBOL_FIELDS
-#endif
+/* Match section group name, the sh_info field and the section_id
+ field. */
+struct elf_section_match
+{
+ const char *group_name;
+ const char *linked_to_symbol_name;
+ unsigned int info;
+ unsigned int section_id;
+ flagword flags;
+};
-/* #include "targ-cpu.h" */
+#define OBJ_SYMFIELD_TYPE struct elf_obj_sy
#ifndef FALSE
#define FALSE 0
#endif
extern void elf_begin (void);
+#ifndef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX '.'
+#endif
+
/* should be conditional on address size! */
#define elf_symbol(asymbol) ((elf_symbol_type *) (&(asymbol)->the_bfd))
extern asection *gdb_section;
-#ifndef obj_sec_set_private_data
-#define obj_sec_set_private_data(B, S) \
- if (! BFD_SEND ((B), _new_section_hook, ((B), (S)))) \
- as_fatal (_("can't allocate ELF private section data: %s"), \
- bfd_errmsg (bfd_get_error ()))
-#endif
-
#ifndef obj_frob_file
#define obj_frob_file elf_frob_file
#endif
extern void obj_elf_section_change_hook (void);
extern void obj_elf_section (int);
+extern const char * obj_elf_section_name (void);
extern void obj_elf_previous (int);
extern void obj_elf_version (int);
extern void obj_elf_common (int);
extern void obj_elf_data (int);
extern void obj_elf_text (int);
extern void obj_elf_change_section
- (const char *, int, int, int, const char *, int, int);
-extern struct fix *obj_elf_vtable_inherit (int);
-extern struct fix *obj_elf_vtable_entry (int);
+ (const char *, unsigned int, bfd_vma, int, struct elf_section_match *,
+ int, int);
+extern void obj_elf_vtable_inherit (int);
+extern void obj_elf_vtable_entry (int);
+extern struct fix * obj_elf_get_vtable_inherit (void);
+extern struct fix * obj_elf_get_vtable_entry (void);
+extern bfd_boolean obj_elf_seen_attribute
+ (int, unsigned int);
+extern int obj_elf_vendor_attribute (int);
/* BFD wants to write the udata field, which is a no-no for the
predefined section symbols in bfd/section.c. They are read-only. */
(elf_copy_symbol_attributes (DEST, SRC))
#endif
+void elf_adjust_symtab (void);
+#ifndef obj_adjust_symtab
+#define obj_adjust_symtab elf_adjust_symtab
+#endif
+
#ifndef SEPARATE_STAB_SECTIONS
/* Avoid ifndef each separate macro setting by wrapping the whole of the
stab group on the assumption that whoever sets SEPARATE_STAB_SECTIONS
#endif
#ifndef OBJ_MAYBE_ELF
+/* If OBJ_MAYBE_ELF then obj-multi.h will define obj_ecoff_set_ext. */
#define obj_ecoff_set_ext elf_ecoff_set_ext
struct ecoff_extr;
extern void elf_ecoff_set_ext (symbolS *, struct ecoff_extr *);