#### 2.7.4 typedef asymbol

An `asymbol` has the form:

         typedef struct bfd_symbol
         {
           /* A pointer to the BFD which owns the symbol. This information
              is necessary so that a back end can work out what additional
              information (invisible to the application writer) is carried
              with the symbol.

              This field is *almost* redundant, since you can use section->owner
              instead, except that some symbols point to the global sections
              bfd_{abs,com,und}_section.  This could be fixed by making
              these globals be per-bfd (or per-target-flavor).  FIXME.  */
           struct bfd *the_bfd; /* Use bfd_asymbol_bfd(sym) to access this field.  */

           /* The text of the symbol. The name is left alone, and not copied; the
              application may not alter it.  */
           const char *name;

           /* The value of the symbol.  This really should be a union of a
              numeric value with a pointer, since some flags indicate that
              a pointer to another symbol is stored here.  */
           symvalue value;

           /* Attributes of a symbol.  */
         #define BSF_NO_FLAGS    0x00

           /* The symbol has local scope; static in C. The value
              is the offset into the section of the data.  */
         #define BSF_LOCAL      0x01

           /* The symbol has global scope; initialized data in C. The
              value is the offset into the section of the data.  */
         #define BSF_GLOBAL     0x02

           /* The symbol has global scope and is exported. The value is
              the offset into the section of the data.  */
         #define BSF_EXPORT     BSF_GLOBAL /* No real difference.  */

           /* A normal C symbol would be one of:
              BSF_LOCAL, BSF_FORT_COMM,  BSF_UNDEFINED or
              BSF_GLOBAL.  */

           /* The symbol is a debugging record. The value has an arbitrary
              meaning, unless BSF_DEBUGGING_RELOC is also set.  */
         #define BSF_DEBUGGING  0x08

           /* The symbol denotes a function entry point.  Used in ELF,
              perhaps others someday.  */
         #define BSF_FUNCTION    0x10

           /* Used by the linker.  */
         #define BSF_KEEP        0x20
         #define BSF_KEEP_G      0x40

           /* A weak global symbol, overridable without warnings by
              a regular global symbol of the same name.  */
         #define BSF_WEAK        0x80

           /* This symbol was created to point to a section, e.g. ELF's
              STT_SECTION symbols.  */
         #define BSF_SECTION_SYM 0x100

           /* The symbol used to be a common symbol, but now it is
              allocated.  */
         #define BSF_OLD_COMMON  0x200

           /* The default value for common data.  */
         #define BFD_FORT_COMM_DEFAULT_VALUE 0

           /* In some files the type of a symbol sometimes alters its
              location in an output file - ie in coff a ISFCN symbol
              which is also C_EXT symbol appears where it was
              declared and not at the end of a section.  This bit is set
              by the target BFD part to convey this information.  */
         #define BSF_NOT_AT_END    0x400

           /* Signal that the symbol is the label of constructor section.  */
         #define BSF_CONSTRUCTOR   0x800

           /* Signal that the symbol is a warning symbol.  The name is a
              warning.  The name of the next symbol is the one to warn about;
              if a reference is made to a symbol with the same name as the next
              symbol, a warning is issued by the linker.  */
         #define BSF_WARNING       0x1000

           /* Signal that the symbol is indirect.  This symbol is an indirect
              pointer to the symbol with the same name as the next symbol.  */
         #define BSF_INDIRECT      0x2000

           /* BSF_FILE marks symbols that contain a file name.  This is used
              for ELF STT_FILE symbols.  */
         #define BSF_FILE          0x4000

           /* Symbol is from dynamic linking information.  */
         #define BSF_DYNAMIC       0x8000

           /* The symbol denotes a data object.  Used in ELF, and perhaps
              others someday.  */
         #define BSF_OBJECT        0x10000

           /* This symbol is a debugging symbol.  The value is the offset
              into the section of the data.  BSF_DEBUGGING should be set
              as well.  */
         #define BSF_DEBUGGING_RELOC 0x20000

           /* This symbol is thread local.  Used in ELF.  */
         #define BSF_THREAD_LOCAL  0x40000

           /* This symbol represents a complex relocation expression,
              with the expression tree serialized in the symbol name.  */
         #define BSF_RELC 0x80000

           /* This symbol represents a signed complex relocation expression,
              with the expression tree serialized in the symbol name.  */
         #define BSF_SRELC 0x100000

           flagword flags;

           /* A pointer to the section to which this symbol is
              relative.  This will always be non NULL, there are special
              sections for undefined and absolute symbols.  */
           struct bfd_section *section;

           /* Back end special data.  */
           union
             {
               void *p;
               bfd_vma i;
             }
           udata;
         }
         asymbol;