#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
#else
#include <config.h>
-extern void fatal (CONST char *, ...);
+extern void fatal (const char *, ...);
#endif
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
-#if !defined (__NetBSD__) && !defined (__OpenBSD__)
+#ifdef HAVE_ELF_H
#include <elf.h>
#endif
#include <sys/mman.h>
#define hdrNil ((pHDRR)0)
#endif
-#ifdef __NetBSD__
-/*
- * NetBSD does not have normal-looking user-land ELF support.
- */
-# ifdef __alpha__
-# define ELFSIZE 64
-# else
-# define ELFSIZE 32
-# endif
+#ifdef __OpenBSD__
# include <sys/exec_elf.h>
+#endif
-# define PT_LOAD Elf_pt_load
-# define SHT_SYMTAB Elf_sht_symtab
-# define SHT_DYNSYM Elf_sht_dynsym
-# define SHT_NULL Elf_sht_null
-# define SHT_NOBITS Elf_sht_nobits
-# define SHT_REL Elf_sht_rel
-# define SHT_RELA Elf_sht_rela
-
-# define SHN_UNDEF Elf_eshn_undefined
-# define SHN_ABS Elf_eshn_absolute
-# define SHN_COMMON Elf_eshn_common
-
-/*
- * The magic of picking the right size types is handled by the ELFSIZE
- * definition above.
- */
+#if defined(__FreeBSD__) && (defined(__alpha__) || defined(_LP64))
# ifdef __STDC__
-# define ElfW(type) Elf_##type
+# define ElfW(type) Elf64_##type
# else
-# define ElfW(type) Elf_/**/type
-# endif
-
-# ifdef __alpha__
-# include <sys/exec_ecoff.h>
-# define HDRR struct ecoff_symhdr
-# define pHDRR HDRR *
+# define ElfW(type) Elf64_/**/type
# endif
-#endif /* __NetBSD__ */
-
-#ifdef __OpenBSD__
-# include <sys/exec_elf.h>
#endif
#if __GNU_LIBRARY__ - 0 >= 6
#ifndef ElfW
# ifdef __STDC__
-# define ElfW(type) Elf32_##type
+# define ElfBitsW(bits, type) Elf##bits##_##type
# else
-# define ElfW(type) Elf32_/**/type
+# define ElfBitsW(bits, type) Elf/**/bits/**/_/**/type
# endif
+# ifndef ELFSIZE
+# ifdef _LP64
+# define ELFSIZE 64
+# else
+# define ELFSIZE 32
+# endif
+# endif
+ /* This macro expands `bits' before invoking ElfBitsW. */
+# define ElfExpandBitsW(bits, type) ElfBitsW (bits, type)
+# define ElfW(type) ElfExpandBitsW (ELFSIZE, type)
#endif
#ifndef ELF_BSS_SECTION_NAME
old_sbss_index = -1;
old_bss_addr = OLD_SECTION_H(old_bss_index).sh_addr;
old_bss_size = OLD_SECTION_H(old_bss_index).sh_size;
- new_data2_offset = OLD_SECTION_H(old_bss_index).sh_offset;
new_data2_index = old_bss_index;
}
else
old_bss_addr = OLD_SECTION_H(old_sbss_index).sh_addr;
old_bss_size = OLD_SECTION_H(old_bss_index).sh_size
+ OLD_SECTION_H(old_sbss_index).sh_size;
- new_data2_offset = OLD_SECTION_H(old_sbss_index).sh_offset;
new_data2_index = old_sbss_index;
}
if (old_mdebug_index == old_file_h->e_shnum)
old_mdebug_index = 0;
+ for (old_data_index = 1; old_data_index < (int) old_file_h->e_shnum;
+ old_data_index++)
+ {
+#ifdef DEBUG
+ fprintf (stderr, "Looking for .data - found %s\n",
+ old_section_names + OLD_SECTION_H (old_data_index).sh_name);
+#endif
+ if (!strcmp (old_section_names + OLD_SECTION_H (old_data_index).sh_name,
+ ".data"))
+ break;
+ }
+ if (old_data_index == old_file_h->e_shnum)
+ old_data_index = 0;
+
#if defined (emacs) || !defined (DEBUG)
new_bss_addr = (ElfW(Addr)) sbrk (0);
#else
#endif
new_data2_addr = old_bss_addr;
new_data2_size = new_bss_addr - old_bss_addr;
+ new_data2_offset = OLD_SECTION_H (old_data_index).sh_offset +
+ (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr);
#ifdef DEBUG
fprintf (stderr, "old_bss_index %d\n", old_bss_index);