From Eric Youngdale <eric@andante.jic.com>:
authorIan Lance Taylor <ian@airs.com>
Wed, 19 Feb 1997 20:36:23 +0000 (20:36 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 19 Feb 1997 20:36:23 +0000 (20:36 +0000)
* external.h, internal.h, common.h: Added new structures and
definitions for ELF versions.

include/elf/ChangeLog
include/elf/common.h
include/elf/external.h [new file with mode: 0644]

index dff383e..4b9d54e 100644 (file)
@@ -1,3 +1,9 @@
+Wed Feb 19 15:35:31 1997  Ian Lance Taylor  <ian@cygnus.com>
+
+       From Eric Youngdale <eric@andante.jic.com>:
+       * external.h, internal.h, common.h: Added new structures and
+       definitions for ELF versions.
+
 start-sanitize-d30v
 Tue Feb 18 17:40:36 1997  Martin M. Hunt  <hunt@pizza.cygnus.com>
 
index 131ec29..d659f91 100644 (file)
@@ -1,5 +1,5 @@
 /* ELF support for BFD.
-   Copyright (C) 1991, 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
 
    Written by Fred Fish @ Cygnus Support, from information published
    in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -179,6 +179,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define SHT_REL                9               /* Relocation entries, no addends */
 #define SHT_SHLIB      10              /* Reserved, unspecified semantics */
 #define SHT_DYNSYM     11              /* Dynamic linking symbol table */
+
+/* The next three section types are defined by Solaris, and are named
+   SHT_SUNW*.  We use them in GNU code, so we also define SHT_GNU*
+   versions.  */
+#define SHT_SUNW_verdef        0x6ffffffd      /* Versions defined by file */
+#define SHT_SUNW_verneed 0x6ffffffe    /* Versions needed by file */
+#define SHT_SUNW_versym        0x6fffffff      /* Symbol versions */
+
+#define SHT_GNU_verdef SHT_SUNW_verdef
+#define SHT_GNU_verneed        SHT_SUNW_verneed
+#define SHT_GNU_versym SHT_SUNW_versym
+
 #define SHT_LOPROC     0x70000000      /* Processor-specific semantics, lo */
 #define SHT_HIPROC     0x7FFFFFFF      /* Processor-specific semantics, hi */
 #define SHT_LOUSER     0x80000000      /* Application-specific semantics */
@@ -273,6 +285,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define DT_DEBUG       21
 #define DT_TEXTREL     22
 #define DT_JMPREL      23
+
+/* The next four dynamic tags are used on Solaris.  We support them
+   everywhere.  */
+#define DT_VERDEF      0x6ffffffc
+#define DT_VERDEFNUM   0x6ffffffd
+#define DT_VERNEED     0x6ffffffe
+#define DT_VERNEEDNUM  0x6fffffff
+
+/* This tag is a GNU extension to the Solaris version scheme.  */
+#define DT_VERSYM      0x6ffffff0
+
 #define DT_LOPROC      0x70000000
 #define DT_HIPROC      0x7fffffff
 
@@ -282,4 +305,35 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define DT_AUXILIARY   0x7ffffffd
 #define DT_FILTER      0x7fffffff
 
+/* These constants are used for the version number of a Elf32_Verdef
+   structure.  */
+
+#define VER_DEF_NONE           0
+#define VER_DEF_CURRENT                1
+
+/* These constants appear in the vd_flags field of a Elf32_Verdef
+   structure.  */
+
+#define VER_FLG_BASE           0x1
+#define VER_FLG_WEAK           0x2
+
+/* These special constants can be found in an Elf32_Versym field.  */
+
+#define VER_NDX_LOCAL          0
+#define VER_NDX_GLOBAL         1
+
+/* These constants are used for the version number of a Elf32_Verneed
+   structure.  */
+
+#define VER_NEED_NONE          0
+#define VER_NEED_CURRENT       1
+
+/* This is a special token which appears as part of a symbol name.  It
+   indictes that the rest of the name is actually the name of a
+   version node, and is not part of the actual name.  This is a GNU
+   extension.  For example, the symbol name `stat@ver2' is taken to
+   mean the symbol `stat' in version `ver2'.  */
+
+#define ELF_VER_CHR    '@'
+
 #endif /* _ELF_COMMON_H */
diff --git a/include/elf/external.h b/include/elf/external.h
new file mode 100644 (file)
index 0000000..0a5d176
--- /dev/null
@@ -0,0 +1,251 @@
+/* ELF support for BFD.
+   Copyright (C) 1991, 92, 93, 95, 1997 Free Software Foundation, Inc.
+
+   Written by Fred Fish @ Cygnus Support, from information published
+   in "UNIX System V Release 4, Programmers Guide: ANSI C and
+   Programming Support Tools".
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program 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 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+
+/* This file is part of ELF support for BFD, and contains the portions
+   that describe how ELF is represented externally by the BFD library.
+   I.E. it describes the in-file representation of ELF.  It requires
+   the elf-common.h file which contains the portions that are common to
+   both the internal and external representations. */
+   
+/* The 64-bit stuff is kind of random.  Perhaps someone will publish a
+   spec someday.  */
+
+#ifndef _ELF_EXTERNAL_H
+#define _ELF_EXTERNAL_H
+
+/* ELF Header (32-bit implementations) */
+
+typedef struct {
+  unsigned char        e_ident[16];            /* ELF "magic number" */
+  unsigned char        e_type[2];              /* Identifies object file type */
+  unsigned char        e_machine[2];           /* Specifies required architecture */
+  unsigned char        e_version[4];           /* Identifies object file version */
+  unsigned char        e_entry[4];             /* Entry point virtual address */
+  unsigned char        e_phoff[4];             /* Program header table file offset */
+  unsigned char        e_shoff[4];             /* Section header table file offset */
+  unsigned char        e_flags[4];             /* Processor-specific flags */
+  unsigned char        e_ehsize[2];            /* ELF header size in bytes */
+  unsigned char        e_phentsize[2];         /* Program header table entry size */
+  unsigned char        e_phnum[2];             /* Program header table entry count */
+  unsigned char        e_shentsize[2];         /* Section header table entry size */
+  unsigned char        e_shnum[2];             /* Section header table entry count */
+  unsigned char        e_shstrndx[2];          /* Section header string table index */
+} Elf32_External_Ehdr;
+
+typedef struct {
+  unsigned char        e_ident[16];            /* ELF "magic number" */
+  unsigned char        e_type[2];              /* Identifies object file type */
+  unsigned char        e_machine[2];           /* Specifies required architecture */
+  unsigned char        e_version[4];           /* Identifies object file version */
+  unsigned char        e_entry[8];             /* Entry point virtual address */
+  unsigned char        e_phoff[8];             /* Program header table file offset */
+  unsigned char        e_shoff[8];             /* Section header table file offset */
+  unsigned char        e_flags[4];             /* Processor-specific flags */
+  unsigned char        e_ehsize[2];            /* ELF header size in bytes */
+  unsigned char        e_phentsize[2];         /* Program header table entry size */
+  unsigned char        e_phnum[2];             /* Program header table entry count */
+  unsigned char        e_shentsize[2];         /* Section header table entry size */
+  unsigned char        e_shnum[2];             /* Section header table entry count */
+  unsigned char        e_shstrndx[2];          /* Section header string table index */
+} Elf64_External_Ehdr;
+
+/* Program header */
+
+typedef struct {
+  unsigned char        p_type[4];              /* Identifies program segment type */
+  unsigned char        p_offset[4];            /* Segment file offset */
+  unsigned char        p_vaddr[4];             /* Segment virtual address */
+  unsigned char        p_paddr[4];             /* Segment physical address */
+  unsigned char        p_filesz[4];            /* Segment size in file */
+  unsigned char        p_memsz[4];             /* Segment size in memory */
+  unsigned char        p_flags[4];             /* Segment flags */
+  unsigned char        p_align[4];             /* Segment alignment, file & memory */
+} Elf32_External_Phdr;
+
+typedef struct {
+  unsigned char        p_type[4];              /* Identifies program segment type */
+  unsigned char        p_flags[4];             /* Segment flags */
+  unsigned char        p_offset[8];            /* Segment file offset */
+  unsigned char        p_vaddr[8];             /* Segment virtual address */
+  unsigned char        p_paddr[8];             /* Segment physical address */
+  unsigned char        p_filesz[8];            /* Segment size in file */
+  unsigned char        p_memsz[8];             /* Segment size in memory */
+  unsigned char        p_align[8];             /* Segment alignment, file & memory */
+} Elf64_External_Phdr;
+
+/* Section header */
+
+typedef struct {
+  unsigned char        sh_name[4];             /* Section name, index in string tbl */
+  unsigned char        sh_type[4];             /* Type of section */
+  unsigned char        sh_flags[4];            /* Miscellaneous section attributes */
+  unsigned char        sh_addr[4];             /* Section virtual addr at execution */
+  unsigned char        sh_offset[4];           /* Section file offset */
+  unsigned char        sh_size[4];             /* Size of section in bytes */
+  unsigned char        sh_link[4];             /* Index of another section */
+  unsigned char        sh_info[4];             /* Additional section information */
+  unsigned char        sh_addralign[4];        /* Section alignment */
+  unsigned char        sh_entsize[4];          /* Entry size if section holds table */
+} Elf32_External_Shdr;
+
+typedef struct {
+  unsigned char        sh_name[4];             /* Section name, index in string tbl */
+  unsigned char        sh_type[4];             /* Type of section */
+  unsigned char        sh_flags[8];            /* Miscellaneous section attributes */
+  unsigned char        sh_addr[8];             /* Section virtual addr at execution */
+  unsigned char        sh_offset[8];           /* Section file offset */
+  unsigned char        sh_size[8];             /* Size of section in bytes */
+  unsigned char        sh_link[4];             /* Index of another section */
+  unsigned char        sh_info[4];             /* Additional section information */
+  unsigned char        sh_addralign[8];        /* Section alignment */
+  unsigned char        sh_entsize[8];          /* Entry size if section holds table */
+} Elf64_External_Shdr;
+
+/* Symbol table entry */
+
+typedef struct {
+  unsigned char        st_name[4];             /* Symbol name, index in string tbl */
+  unsigned char        st_value[4];            /* Value of the symbol */
+  unsigned char        st_size[4];             /* Associated symbol size */
+  unsigned char        st_info[1];             /* Type and binding attributes */
+  unsigned char        st_other[1];            /* No defined meaning, 0 */
+  unsigned char        st_shndx[2];            /* Associated section index */
+} Elf32_External_Sym;
+
+typedef struct {
+  unsigned char        st_name[4];             /* Symbol name, index in string tbl */
+  unsigned char        st_info[1];             /* Type and binding attributes */
+  unsigned char        st_other[1];            /* No defined meaning, 0 */
+  unsigned char        st_shndx[2];            /* Associated section index */
+  unsigned char        st_value[8];            /* Value of the symbol */
+  unsigned char        st_size[8];             /* Associated symbol size */
+} Elf64_External_Sym;
+
+/* Note segments */
+
+typedef struct {
+  unsigned char        namesz[4];              /* Size of entry's owner string */
+  unsigned char        descsz[4];              /* Size of the note descriptor */
+  unsigned char        type[4];                /* Interpretation of the descriptor */
+  char         name[1];                /* Start of the name+desc data */
+} Elf_External_Note;
+
+/* Relocation Entries */
+typedef struct {
+  unsigned char r_offset[4];   /* Location at which to apply the action */
+  unsigned char        r_info[4];      /* index and type of relocation */
+} Elf32_External_Rel;
+
+typedef struct {
+  unsigned char r_offset[4];   /* Location at which to apply the action */
+  unsigned char        r_info[4];      /* index and type of relocation */
+  unsigned char        r_addend[4];    /* Constant addend used to compute value */
+} Elf32_External_Rela;
+
+typedef struct {
+  unsigned char r_offset[8];   /* Location at which to apply the action */
+  unsigned char        r_info[8];      /* index and type of relocation */
+} Elf64_External_Rel;
+
+typedef struct {
+  unsigned char r_offset[8];   /* Location at which to apply the action */
+  unsigned char        r_info[8];      /* index and type of relocation */
+  unsigned char        r_addend[8];    /* Constant addend used to compute value */
+} Elf64_External_Rela;
+
+/* dynamic section structure */
+
+typedef struct {
+  unsigned char        d_tag[4];               /* entry tag value */
+  union {
+    unsigned char      d_val[4];
+    unsigned char      d_ptr[4];
+  } d_un;
+} Elf32_External_Dyn;
+
+typedef struct {
+  unsigned char        d_tag[8];               /* entry tag value */
+  union {
+    unsigned char      d_val[8];
+    unsigned char      d_ptr[8];
+  } d_un;
+} Elf64_External_Dyn;
+
+/* This structure appears in a SHT_GNU_verdef section.  */
+
+typedef struct {
+  unsigned char                vd_version[2];
+  unsigned char                vd_flags[2];
+  unsigned char                vd_ndx[2];
+  unsigned char                vd_cnt[2];
+  unsigned char                vd_hash[4];
+  unsigned char                vd_aux[4];
+  unsigned char                vd_next[4];
+} Elf32_External_Verdef;
+
+typedef Elf32_External_Verdef Elf64_External_Verdef;
+
+/* This structure appears in a SHT_GNU_verdef section.  */
+
+typedef struct {
+  unsigned char                vda_name[4];
+  unsigned char                vda_next[4];
+} Elf32_External_Verdaux;
+
+typedef Elf32_External_Verdaux Elf64_External_Verdaux;
+/* This structure appears in a SHT_GNU_verneed section.  */
+
+typedef struct {
+  unsigned char                vn_version[2];
+  unsigned char                vn_cnt[2];
+  unsigned char                vn_file[4];
+  unsigned char                vn_aux[4];
+  unsigned char                vn_next[4];
+} Elf32_External_Verneed;
+
+typedef Elf32_External_Verneed Elf64_External_Verneed;
+
+/* This structure appears in a SHT_GNU_verneed section.  */
+
+typedef struct {
+  unsigned char                vna_hash[4];
+  unsigned char                vna_flags[2];
+  unsigned char                vna_other[2];
+  unsigned char                vna_name[4];
+  unsigned char                vna_next[4];
+} Elf32_External_Vernaux;
+
+typedef Elf32_External_Vernaux Elf64_External_Vernaux;
+
+/* This structure appears in a SHT_GNU_versym section.  This is not a
+   standard ELF structure; ELF just uses Elf32_Half.  */
+
+typedef struct {
+  unsigned char                vs_vers[2];
+} Elf32_External_Versym;
+
+typedef Elf32_External_Versym Elf64_External_Versym;
+
+#endif /* _ELF_EXTERNAL_H */