summaryrefslogtreecommitdiff
path: root/other/burneye/patches/binutils-patch.h
blob: 0a50bb054ad92873283459273665ceb4411b592b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
--- elfcode.h.orig	Mon Jun 16 11:45:32 1997
+++ elfcode.h	Sat Apr 22 10:18:56 2000
@@ -1,5 +1,5 @@
 /* ELF executable support for BFD.
-   Copyright 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+   Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
 
    Written by Fred Fish @ Cygnus Support, from information published
    in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -517,14 +517,14 @@
   elf_debug_file (i_ehdrp);
 #endif
 
-  /* If there is no section header table, we're hosed. */
-  if (i_ehdrp->e_shoff == 0)
+  /* If there is no section header table, and relocatable, then we're hosed. */
+  if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
     goto got_wrong_format_error;
 
   /* As a simple sanity check, verify that the what BFD thinks is the
      size of each section header table entry actually matches the size
-     recorded in the file. */
-  if (i_ehdrp->e_shentsize != sizeof (x_shdr))
+     recorded in the file, but only if there are any sections. */
+  if (i_ehdrp->e_shentsize != sizeof (x_shdr) &&  i_ehdrp->e_shnum != 0)
     goto got_wrong_format_error;
 
   ebd = get_elf_backend_data (abfd);
@@ -579,6 +579,7 @@
   /* Allocate space for a copy of the section header table in
      internal form, seek to the section header table in the file,
      read it in, and convert it to internal form.  */
+ if (i_ehdrp->e_shnum!=0) {
   i_shdrp = ((Elf_Internal_Shdr *)
 	     bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
   elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
@@ -609,6 +610,7 @@
       if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
 	goto got_no_match;
     }
+ }
 
   /* Read in the program headers.  */
   if (i_ehdrp->e_phnum == 0)
@@ -644,6 +646,7 @@
      bfd_section_from_shdr with it (since this particular strtab is
      used to find all of the ELF section names.) */
 
+ if (i_ehdrp->e_shstrndx != 0) {
   shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
   if (!shstrtab)
     goto got_no_match;
@@ -657,6 +660,7 @@
       if (! bfd_section_from_shdr (abfd, shindex))
 	goto got_no_match;
     }
+ }
 
   /* Let the backend double check the format and override global
      information.  */
@@ -930,7 +934,7 @@
 {
   Elf_Internal_Shdr *hdr;
   Elf_Internal_Shdr *verhdr;
-  long symcount;		/* Number of external ELF symbols */
+  unsigned long symcount;	/* Number of external ELF symbols */
   elf_symbol_type *sym;		/* Pointer to current bfd symbol */
   elf_symbol_type *symbase;	/* Buffer for generated bfd symbols */
   Elf_Internal_Sym i_sym;
@@ -978,7 +982,7 @@
     sym = symbase = NULL;
   else
     {
-      long i;
+      unsigned long i;
 
       if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
 	return -1;