--- /dev/null
+/* Get public symbol information.
+ Copyright (C) 2002 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2 as
+ published by the Free Software Foundation.
+
+ 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. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+
+#include <libdwP.h>
+
+
+static int
+get_offsets (Dwarf *dbg)
+{
+ size_t allocated = 0;
+ size_t cnt = 0;
+ struct pubnames_s *mem = NULL;
+ const size_t entsize = sizeof (struct pubnames_s);
+ unsigned char *const startp = dbg->sectiondata[IDX_debug_pubnames]->d_buf;
+ unsigned char *readp = startp;
+ unsigned char *endp = readp + dbg->sectiondata[IDX_debug_pubnames]->d_size;
+
+ while (readp + 14 < endp)
+ {
+ /* If necessary, allocate more entries. */
+ if (cnt >= allocated)
+ {
+ allocated = MAX (10, 2 * allocated);
+ struct pubnames_s *newmem
+ = (struct pubnames_s *) realloc (mem, allocated * entsize);
+ if (newmem == NULL)
+ {
+ __libdwarf_seterrno (DWARF_E_NOMEM);
+ err_return:
+ free (mem);
+ return -1;
+ }
+
+ mem = newmem;
+ }
+
+ /* Read the set header. */
+ int len_bytes = 4;
+ Dwarf_Off len = read_4ubyte_unaligned_inc (dbg, readp);
+ if (len == 0xffffffff)
+ {
+ len = read_8ubyte_unaligned_inc (dbg, readp);
+ len_bytes = 8;
+ }
+
+ /* Now we know the offset of the first offset/name pair. */
+ mem[cnt].set_start = readp + 2 + 2 * len_bytes - startp;
+ mem[cnt].address_len = len_bytes;
+ if (mem[cnt].set_start >= dbg->sectiondata[IDX_debug_pubnames]->d_size)
+ /* Something wrong, the first entry is beyond the end of
+ the section. */
+ break;
+
+ /* Read the version. It better be two for now. */
+ uint16_t version = read_2ubyte_unaligned (dbg, readp);
+ if (version != 2)
+ {
+ __libdwarf_seterrno (DWARF_E_INVALID_VERSION);
+ goto err_return;
+ }
+
+ /* Get the CU offset. */
+ if (len_bytes == 4)
+ mem[cnt].cu_offset = read_4ubyte_unaligned (dbg, readp + 2);
+ else
+ mem[cnt].cu_offset = read_8ubyte_unaligned (dbg, readp + 2);
+
+ /* Determine the size of the CU header. */
+ assert (dbg->sectiondata[IDX_debug_info] != NULL);
+ assert (dbg->sectiondata[IDX_debug_info]->d_buf != NULL);
+ assert (mem[cnt].cu_offset + 3
+ < dbg->sectiondata[IDX_debug_info]->d_size);
+ unsigned char *infop
+ = ((unsigned char *) dbg->sectiondata[IDX_debug_info]->d_buf
+ + mem[cnt].cu_offset);
+ if (read_4ubyte_unaligned_noncvt (infop) == 0xffffffff)
+ mem[cnt].cu_header_size = 23;
+ else
+ mem[cnt].cu_header_size = 11;
+
+ ++cnt;
+
+ /* Advance to the next set. */
+ readp += len;
+ }
+
+ if (mem == NULL)
+ {
+ __libdwarf_seterrno (DWARF_E_NO_ENTRY);
+ return -1;
+ }
+
+ dbg->pubnames_sets = (struct pubnames_s *) realloc (mem, cnt * entsize);
+ dbg->pubnames_nsets = cnt;
+
+ return 0;
+}
+
+
+size_t
+dwarf_get_pubnames (dbg, callback, arg, offset)
+ Dwarf *dbg;
+ int (*callback) (Dwarf *, Dwarf_Global *, void *);
+ void *arg;
+ size_t offset;
+{
+ /* Make sure it is a valid offset. */
+ if (unlikely (dbg->sectiondata[IDX_debug_pubnames] == NULL
+ || offset >= dbg->sectiondata[IDX_debug_pubnames]->d_size))
+ /* No (more) entry. */
+ return 0;
+
+ /* If necessary read the set information. */
+ if (dbg->pubnames_nsets == 0 && get_offsets (dbg) != 0)
+ return (size_t) -1;
+
+ /* Find the place where to start. */
+ size_t cnt;
+ if (offset == 0)
+ {
+ cnt = 0;
+ offset = dbg->pubnames_sets[0].set_start;
+ }
+ else
+ {
+ for (cnt = 0; cnt + 1 < dbg->pubnames_nsets; ++cnt)
+ if (offset >= dbg->pubnames_sets[cnt].set_start)
+ {
+ assert (offset < dbg->pubnames_sets[cnt + 1].set_start);
+ break;
+ }
+ assert (cnt + 1 < dbg->pubnames_nsets);
+ }
+
+ unsigned char *startp
+ = (unsigned char *) dbg->sectiondata[IDX_debug_pubnames]->d_buf;
+ unsigned char *readp = startp + offset;
+ while (1)
+ {
+ Dwarf_Global gl;
+
+ gl.cu_offset = (dbg->pubnames_sets[cnt].cu_offset
+ + dbg->pubnames_sets[cnt].cu_header_size);
+
+ while (1)
+ {
+ /* READP points to the next offset/name pair. */
+ if (dbg->pubnames_sets[cnt].address_len == 4)
+ gl.die_offset = read_4ubyte_unaligned_inc (dbg, readp);
+ else
+ gl.die_offset = read_8ubyte_unaligned_inc (dbg, readp);
+
+ /* If the offset is zero we reached the end of the set. */
+ if (gl.die_offset == 0)
+ break;
+
+ /* Add the CU offset. */
+ gl.die_offset += dbg->pubnames_sets[cnt].cu_offset;
+
+ gl.name = (char *) readp;
+ readp = (unsigned char *) rawmemchr (gl.name, '\0') + 1;
+
+ /* We found name and DIE offset. Report it. */
+ if (callback (dbg, &gl, arg) != DWARF_CB_OK)
+ {
+ /* The user wants us to stop. Return the offset of the
+ next entry. */
+ return readp - startp;
+ }
+ }
+
+ if (++cnt == dbg->pubnames_nsets)
+ /* This was the last set. */
+ break;
+
+ startp = (unsigned char *) dbg->sectiondata[IDX_debug_pubnames]->d_buf;
+ readp = startp + dbg->pubnames_sets[cnt].set_start;
+ }
+
+ /* We are done. No more entries. */
+ return 0;
+}
--- /dev/null
+/* Check section name for being that of a debug informatino section.
+ Copyright (C) 2002 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdint.h>
+#include <libeblP.h>
+
+
+bool
+ebl_debugscn_p (ebl, name)
+ Ebl *ebl;
+ const char *name;
+{
+ return ebl->debugscn_p (name);
+}
--- /dev/null
+/* Interface for libebl_sparc module.
+ Copyright (C) 2002 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifndef _LIBEBL_SPARC_H
+#define _LIBEBL_SPARC_H 1
+
+#include <libeblP.h>
+
+
+/* Constructor. */
+extern int sparc_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
+
+/* Destructor. */
+extern void sparc_destr (Ebl *bh);
+
+
+/* Function to get relocation type name. */
+extern const char *sparc_reloc_type_name (int type, char *buf, size_t len);
+
+/* Check relocation type. */
+extern bool sparc_reloc_type_check (int type);
+
+/* Code note handling. */
+extern bool sparc_core_note (const char *name, uint32_t type, uint32_t descsz,
+ const char *desc);
+
+#endif /* libebl_sparc.h */
--- /dev/null
+ELFUTILS_1.0 {
+ global:
+ sparc_backend_name;
+ sparc_destr;
+ sparc_init;
+ sparc_reloc_type_check;
+ sparc_reloc_type_name;
+
+ local:
+ *;
+};
--- /dev/null
+/* Destructor for SPARC specific backend library.
+ Copyright (C) 2002 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libebl_sparc.h>
+
+
+void
+sparc_destr (bh)
+ Ebl *bh;
+{
+ /* Nothing to do so far. */
+}
--- /dev/null
+/* Initialization of SPARC specific backend library.
+ Copyright (C) 2002 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libebl_sparc.h>
+
+
+int
+sparc_init (elf, machine, eh, ehlen)
+ Elf *elf;
+ GElf_Half machine;
+ Ebl *eh;
+ size_t ehlen;
+{
+ /* Check whether the Elf_BH object has a sufficent size. */
+ if (ehlen < sizeof (Ebl))
+ return 1;
+
+ /* We handle it. */
+ if (machine == EM_SPARCV9)
+ eh->name = "SPARC v9";
+ else if (machine == EM_SPARC32PLUS)
+ eh->name = "SPARC v8+";
+ else
+ eh->name = "SPARC";
+ eh->reloc_type_name = sparc_reloc_type_name;
+ eh->reloc_type_check = sparc_reloc_type_check;
+ //eh->core_note = sparc_core_note;
+ eh->destr = sparc_destr;
+
+ return 0;
+}
--- /dev/null
+/* SPARC specific symbolic name handling.
+ Copyright (C) 2002, 2003 Red Hat, Inc.
+ Written by Jakub Jelinek <jakub@redhat.com>, 2002.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <elf.h>
+#include <stddef.h>
+
+#include <libebl_sparc.h>
+
+
+/* Return of the backend. */
+const char *
+sparc_backend_name (void)
+{
+ return "sparc";
+}
+
+
+/* Relocation mapping table. */
+static const char *reloc_map_table[] =
+ {
+ [R_SPARC_NONE] = "R_SPARC_NONE",
+ [R_SPARC_8] = "R_SPARC_8",
+ [R_SPARC_16] = "R_SPARC_16",
+ [R_SPARC_32] = "R_SPARC_32",
+ [R_SPARC_DISP8] = "R_SPARC_DISP8",
+ [R_SPARC_DISP16] = "R_SPARC_DISP16",
+ [R_SPARC_DISP32] = "R_SPARC_DISP32",
+ [R_SPARC_WDISP30] = "R_SPARC_WDISP30",
+ [R_SPARC_WDISP22] = "R_SPARC_WDISP22",
+ [R_SPARC_HI22] = "R_SPARC_HI22",
+ [R_SPARC_22] = "R_SPARC_22",
+ [R_SPARC_13] = "R_SPARC_13",
+ [R_SPARC_LO10] = "R_SPARC_LO10",
+ [R_SPARC_GOT10] = "R_SPARC_GOT10",
+ [R_SPARC_GOT13] = "R_SPARC_GOT13",
+ [R_SPARC_GOT22] = "R_SPARC_GOT22",
+ [R_SPARC_PC10] = "R_SPARC_PC10",
+ [R_SPARC_PC22] = "R_SPARC_PC22",
+ [R_SPARC_WPLT30] = "R_SPARC_WPLT30",
+ [R_SPARC_COPY] = "R_SPARC_COPY",
+ [R_SPARC_GLOB_DAT] = "R_SPARC_GLOB_DAT",
+ [R_SPARC_JMP_SLOT] = "R_SPARC_JMP_SLOT",
+ [R_SPARC_RELATIVE] = "R_SPARC_RELATIVE",
+ [R_SPARC_UA32] = "R_SPARC_UA32",
+ [R_SPARC_PLT32] = "R_SPARC_PLT32",
+ [R_SPARC_HIPLT22] = "R_SPARC_HIPLT22",
+ [R_SPARC_LOPLT10] = "R_SPARC_LOPLT10",
+ [R_SPARC_PCPLT32] = "R_SPARC_PCPLT32",
+ [R_SPARC_PCPLT22] = "R_SPARC_PCPLT22",
+ [R_SPARC_PCPLT10] = "R_SPARC_PCPLT10",
+ [R_SPARC_10] = "R_SPARC_10",
+ [R_SPARC_11] = "R_SPARC_11",
+ [R_SPARC_64] = "R_SPARC_64",
+ [R_SPARC_OLO10] = "R_SPARC_OLO10",
+ [R_SPARC_HH22] = "R_SPARC_HH22",
+ [R_SPARC_HM10] = "R_SPARC_HM10",
+ [R_SPARC_LM22] = "R_SPARC_LM22",
+ [R_SPARC_PC_HH22] = "R_SPARC_PC_HH22",
+ [R_SPARC_PC_HM10] = "R_SPARC_PC_HM10",
+ [R_SPARC_PC_LM22] = "R_SPARC_PC_LM22",
+ [R_SPARC_WDISP16] = "R_SPARC_WDISP16",
+ [R_SPARC_WDISP19] = "R_SPARC_WDISP19",
+ [R_SPARC_7] = "R_SPARC_7",
+ [R_SPARC_5] = "R_SPARC_5",
+ [R_SPARC_6] = "R_SPARC_6",
+ [R_SPARC_DISP64] = "R_SPARC_DISP64",
+ [R_SPARC_PLT64] = "R_SPARC_PLT64",
+ [R_SPARC_HIX22] = "R_SPARC_HIX22",
+ [R_SPARC_LOX10] = "R_SPARC_LOX10",
+ [R_SPARC_H44] = "R_SPARC_H44",
+ [R_SPARC_M44] = "R_SPARC_M44",
+ [R_SPARC_L44] = "R_SPARC_L44",
+ [R_SPARC_REGISTER] = "R_SPARC_REGISTER",
+ [R_SPARC_UA64] = "R_SPARC_UA64",
+ [R_SPARC_UA16] = "R_SPARC_UA16",
+ [R_SPARC_TLS_GD_HI22] = "R_SPARC_TLS_GD_HI22",
+ [R_SPARC_TLS_GD_LO10] = "R_SPARC_TLS_GD_LO10",
+ [R_SPARC_TLS_GD_ADD] = "R_SPARC_TLS_GD_ADD",
+ [R_SPARC_TLS_GD_CALL] = "R_SPARC_TLS_GD_CALL",
+ [R_SPARC_TLS_LDM_HI22] = "R_SPARC_TLS_LDM_HI22",
+ [R_SPARC_TLS_LDM_LO10] = "R_SPARC_TLS_LDM_LO10",
+ [R_SPARC_TLS_LDM_ADD] = "R_SPARC_TLS_LDM_ADD",
+ [R_SPARC_TLS_LDM_CALL] = "R_SPARC_TLS_LDM_CALL",
+ [R_SPARC_TLS_LDO_HIX22] = "R_SPARC_TLS_LDO_HIX22",
+ [R_SPARC_TLS_LDO_LOX10] = "R_SPARC_TLS_LDO_LOX10",
+ [R_SPARC_TLS_LDO_ADD] = "R_SPARC_TLS_LDO_ADD",
+ [R_SPARC_TLS_IE_HI22] = "R_SPARC_TLS_IE_HI22",
+ [R_SPARC_TLS_IE_LO10] = "R_SPARC_TLS_IE_LO10",
+ [R_SPARC_TLS_IE_LD] = "R_SPARC_TLS_IE_LD",
+ [R_SPARC_TLS_IE_LDX] = "R_SPARC_TLS_IE_LDX",
+ [R_SPARC_TLS_IE_ADD] = "R_SPARC_TLS_IE_ADD",
+ [R_SPARC_TLS_LE_HIX22] = "R_SPARC_TLS_LE_HIX22",
+ [R_SPARC_TLS_LE_LOX10] = "R_SPARC_TLS_LE_LOX10",
+ [R_SPARC_TLS_DTPMOD32] = "R_SPARC_TLS_DTPMOD32",
+ [R_SPARC_TLS_DTPMOD64] = "R_SPARC_TLS_DTPMOD64",
+ [R_SPARC_TLS_DTPOFF32] = "R_SPARC_TLS_DTPOFF32",
+ [R_SPARC_TLS_DTPOFF64] = "R_SPARC_TLS_DTPOFF64",
+ [R_SPARC_TLS_TPOFF32] = "R_SPARC_TLS_TPOFF32",
+ [R_SPARC_TLS_TPOFF64] = "R_SPARC_TLS_TPOFF64"
+ };
+
+
+/* Determine relocation type string for sparc. */
+const char *
+sparc_reloc_type_name (int type, char *buf, size_t len)
+{
+ /* High 24 bits of r_type are used for second addend in R_SPARC_OLO10. */
+ if ((type & 0xff) == R_SPARC_OLO10)
+ return reloc_map_table[type & 0xff];
+
+ if (type < 0 || type >= R_SPARC_NUM)
+ return NULL;
+
+ return reloc_map_table[type];
+}
+
+
+/* Check for correct relocation type. */
+bool
+sparc_reloc_type_check (int type)
+{
+ if ((type & 0xff) == R_SPARC_OLO10)
+ return true;
+ return (type >= R_SPARC_NONE && type < R_SPARC_NUM
+ && reloc_map_table[type] != NULL) ? true : false;
+}
--- /dev/null
+/* Copyright (C) 2002 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#include <errno.h>
+#include <error.h>
+#include <fcntl.h>
+#include <gelf.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int
+main (int argc, char *argv[])
+{
+ if (argc < 3)
+ error (EXIT_FAILURE, 0, "usage: %s FROMNAME TONAME", argv[0]);
+
+ elf_version (EV_CURRENT);
+
+ int infd = open (argv[1], O_RDONLY);
+ if (infd == -1)
+ error (EXIT_FAILURE, errno, "cannot open input file '%s'", argv[1]);
+
+ Elf *inelf = elf_begin (infd, ELF_C_READ, NULL);
+ if (inelf == NULL)
+ error (EXIT_FAILURE, 0, "problems opening '%s' as ELF file: %s",
+ argv[1], elf_errmsg (-1));
+
+ int outfd = creat (argv[2], 0666);
+ if (outfd == -1)
+ error (EXIT_FAILURE, errno, "cannot open output file '%s'", argv[2]);
+
+ Elf *outelf = elf_begin (outfd, ELF_C_WRITE, NULL);
+ if (outelf == NULL)
+ error (EXIT_FAILURE, 0, "problems opening '%s' as ELF file: %s",
+ argv[2], elf_errmsg (-1));
+
+ gelf_newehdr (outelf, gelf_getclass (inelf));
+
+ GElf_Ehdr ehdr_mem;
+ GElf_Ehdr *ehdr;
+ gelf_update_ehdr (outelf, (ehdr = gelf_getehdr (inelf, &ehdr_mem)));
+
+ if (ehdr->e_phnum > 0)
+ {
+ int cnt;
+
+ if (gelf_newphdr (outelf, ehdr->e_phnum) == 0)
+ error (EXIT_FAILURE, 0, "cannot create program header: %s",
+ elf_errmsg (-1));
+
+ for (cnt = 0; cnt < ehdr->e_phnum; ++cnt)
+ {
+ GElf_Phdr phdr_mem;
+
+ gelf_update_phdr (outelf, cnt, gelf_getphdr (inelf, cnt, &phdr_mem));
+ }
+ }
+
+ Elf_Scn *scn = NULL;
+ while ((scn = elf_nextscn (inelf, scn)) != NULL)
+ {
+ Elf_Scn *newscn = elf_newscn (outelf);
+
+ GElf_Shdr shdr_mem;
+ gelf_update_shdr (newscn, gelf_getshdr (scn, &shdr_mem));
+
+ *elf_newdata (newscn) = *elf_getdata (scn, NULL);
+ }
+
+ elf_flagelf (outelf, ELF_C_SET, ELF_F_LAYOUT);
+
+ if (elf_update (outelf, ELF_C_WRITE) == -1)
+ error (EXIT_FAILURE, 0, "elf_update failed: %s", elf_errmsg (-1));
+
+ close (outfd);
+
+ return 0;
+}
--- /dev/null
+/* Copyright (C) 2002 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#include <fcntl.h>
+#include <libelf.h>
+#include <libdw.h>
+#include <stdio.h>
+#include <unistd.h>
+
+
+static int globcnt;
+
+static int
+callback (Dwarf *dbg, Dwarf_Global *gl, void *arg)
+{
+ printf (" [%2d] \"%s\", die: %llu, cu: %llu\n",
+ globcnt++, gl->name, (unsigned long long int) gl->die_offset,
+ (unsigned long long int) gl->cu_offset);
+
+#if 0
+ Dwarf_Die cu_die;
+ const char *cuname;
+ if (dwarf_offdie (dbg, gl->cu_offset, &cu_die) == NULL
+ || (cuname = dwarf_diename (&cu_die)) == NULL)
+ {
+ puts ("failed to get CU die");
+ result = 1;
+ }
+ else
+ {
+ printf ("CU name: \"%s\"\n", cuname);
+ dwarf_dealloc (dbg, cuname, DW_DLA_STRING);
+ }
+
+ const char *diename;
+ if (dwarf_offdie (dbg, gl->die_offset, &die) == NULL
+ || (diename = dwarf_diename (&die)) == NULL)
+ {
+ puts ("failed to get object die");
+ result = 1;
+ }
+ else
+ {
+ printf ("object name: \"%s\"\n", diename);
+ dwarf_dealloc (dbg, diename, DW_DLA_STRING);
+ }
+#endif
+ return DWARF_CB_OK;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ int result = 0;
+ int cnt;
+
+ for (cnt = 1; cnt < argc; ++cnt)
+ {
+ int fd = open (argv[cnt], O_RDONLY);
+ Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
+ if (dbg == NULL)
+ {
+ printf ("%s not usable: %s\n", argv[cnt], dwarf_errmsg (-1));
+ result = 1;
+ close (fd);
+ continue;
+ }
+
+ globcnt = 0;
+
+ if (dwarf_get_pubnames (dbg, callback, NULL, 0) != 0)
+ {
+ printf ("dwarf_get_pubnames didn't return zero: %s\n",
+ dwarf_errmsg (-1));
+ result = 1;
+ }
+
+ dwarf_end (dbg);
+ close (fd);
+ }
+
+ return result;
+}
--- /dev/null
+#! /bin/sh
+# Copyright (C) 2002 Red Hat, Inc.
+# Written by Jakub Jelinek <jakub@redhat.com>, 2002.
+#
+# This program is Open Source software; you can redistribute it and/or
+# modify it under the terms of the Open Software License version 1.0 as
+# published by the Open Source Initiative.
+#
+# You should have received a copy of the Open Software License along
+# with this program; if not, you may obtain a copy of the Open Software
+# License version 1.0 from http://www.opensource.org/licenses/osl.php or
+# by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+# 3001 King Ranch Road, Ukiah, CA 95482.
+set -e
+
+./ecp $srcdir/testfile10 testfile10.tmp
+
+cmp $srcdir/testfile10 testfile10.tmp
+
+rm -f testfile10.tmp
+
+exit 0
--- /dev/null
+#! /bin/sh
+# Copyright (C) 2002 Red Hat, Inc.
+# Written by Jakub Jelinek <jakub@redhat.com>, 2002.
+#
+# This program is Open Source software; you can redistribute it and/or
+# modify it under the terms of the Open Software License version 1.0 as
+# published by the Open Source Initiative.
+#
+# You should have received a copy of the Open Software License along
+# with this program; if not, you may obtain a copy of the Open Software
+# License version 1.0 from http://www.opensource.org/licenses/osl.php or
+# by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+# 3001 King Ranch Road, Ukiah, CA 95482.
+set -e
+
+./ecp $srcdir/testfile2 testfile2.tmp
+
+rm -f testfile2.tmp
+
+exit 0
--- /dev/null
+#! /bin/sh
+# Copyright (C) 1999, 2000, 2002 Red Hat, Inc.
+# Written by Ulrich Drepper <drepper@redhat.com>, 1999.
+#
+# This program is Open Source software; you can redistribute it and/or
+# modify it under the terms of the Open Software License version 1.0 as
+# published by the Open Source Initiative.
+#
+# You should have received a copy of the Open Software License along
+# with this program; if not, you may obtain a copy of the Open Software
+# License version 1.0 from http://www.opensource.org/licenses/osl.php or
+# by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+# 3001 King Ranch Road, Ukiah, CA 95482.
+set -e
+
+./get-pubnames2 $srcdir/testfile $srcdir/testfile2 > get-pubnames2.out
+
+#diff -u get-pubnames2.out - <<"EOF"
+# [ 0] "main", die: 104, cu: 11
+#CU name: "m.c"
+#object name: "main"
+# [ 1] "a", die: 174, cu: 11
+#CU name: "m.c"
+#object name: "a"
+# [ 2] "bar", die: 295, cu: 202
+#CU name: "b.c"
+#object name: "bar"
+# [ 3] "foo", die: 5721, cu: 5628
+#CU name: "f.c"
+#object name: "foo"
+# [ 0] "bar", die: 72, cu: 11
+#CU name: "b.c"
+#object name: "bar"
+# [ 1] "foo", die: 2490, cu: 2429
+#CU name: "f.c"
+#object name: "foo"
+# [ 2] "main", die: 2593, cu: 2532
+#CU name: "m.c"
+#object name: "main"
+# [ 3] "a", die: 2663, cu: 2532
+#CU name: "m.c"
+#object name: "a"
+#EOF
+diff -u get-pubnames2.out - <<"EOF"
+ [ 0] "main", die: 104, cu: 11
+ [ 1] "a", die: 174, cu: 11
+ [ 2] "bar", die: 295, cu: 202
+ [ 3] "foo", die: 5721, cu: 5628
+ [ 0] "bar", die: 72, cu: 11
+ [ 1] "foo", die: 2490, cu: 2429
+ [ 2] "main", die: 2593, cu: 2532
+ [ 3] "a", die: 2663, cu: 2532
+EOF
+
+rm -f get-pubnames2.out
+
+exit 0