summaryrefslogtreecommitdiffstats
path: root/patches/binutils-2.18/generic/gentoo/30_all_binutils-multitarget-fixup.patch
blob: ff815e1bc83095f0e93daafd343a7e4136ae989c (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
Fix from upstream for --enable-targets=all on an x86_64 multilib system.

http://sourceware.org/ml/binutils/2007-09/msg00137.html
http://sourceware.org/ml/binutils/2007-09/msg00162.html

2007-09-14  Alan Modra  <amodra@bigpond.net.au>

	* format.c (bfd_check_format_matches): Record matching targets even
	when "matching" is NULL to allow bfd_associated_vector matches.
	Consolidate error return code.  Consolidate ok return code.  Always
	restore original target and format on error.

---
 bfd/format.c |  112 ++++++++++++++++++-----------------------------------------
 1 file changed, 35 insertions(+), 77 deletions(-)

Index: binutils-2.18/bfd/format.c
===================================================================
--- binutils-2.18.orig/bfd/format.c
+++ binutils-2.18/bfd/format.c
@@ -125,6 +125,9 @@ bfd_check_format_matches (bfd *abfd, bfd
   int match_count;
   int ar_match_index;
 
+  if (matching != NULL)
+    *matching = NULL;
+
   if (!bfd_read_p (abfd)
       || (unsigned int) abfd->format >= (unsigned int) bfd_type_end)
     {
@@ -141,11 +144,10 @@ bfd_check_format_matches (bfd *abfd, bfd
   match_count = 0;
   ar_match_index = _bfd_target_vector_entries;
 
-  if (matching)
+  if (matching != NULL || *bfd_associated_vector != NULL)
     {
       bfd_size_type amt;
 
-      *matching = NULL;
       amt = sizeof (*matching_vector) * 2 * _bfd_target_vector_entries;
       matching_vector = bfd_malloc (amt);
       if (!matching_vector)
@@ -162,31 +164,12 @@ bfd_check_format_matches (bfd *abfd, bfd
   if (!abfd->target_defaulted)
     {
       if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)	/* rewind! */
-	{
-	  if (matching)
-	    free (matching_vector);
-	  return FALSE;
-	}
+	goto err_ret;
 
       right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));
 
       if (right_targ)
-	{
-	  abfd->xvec = right_targ;	/* Set the target as returned.  */
-
-	  if (matching)
-	    free (matching_vector);
-
-	  /* If the file was opened for update, then `output_has_begun'
-	     some time ago when the file was created.  Do not recompute
-	     sections sizes or alignments in _bfd_set_section_contents.
-	     We can not set this flag until after checking the format,
-	     because it will interfere with creation of BFD sections.  */
-	  if (abfd->direction == both_direction)
-	    abfd->output_has_begun = TRUE;
-
-	  return TRUE;			/* File position has moved, BTW.  */
-	}
+	goto ok_ret;
 
       /* For a long time the code has dropped through to check all
 	 targets if the specified target was wrong.  I don't know why,
@@ -201,17 +184,7 @@ bfd_check_format_matches (bfd *abfd, bfd
 	 this sort, I changed this test to check only for the binary
 	 target.  */
       if (format == bfd_archive && save_targ == &binary_vec)
-	{
-	  abfd->xvec = save_targ;
-	  abfd->format = bfd_unknown;
-
-	  if (matching)
-	    free (matching_vector);
-
-	  bfd_set_error (bfd_error_file_not_recognized);
-
-	  return FALSE;
-	}
+	goto err_unrecog;
     }
 
   for (target = bfd_target_vector; *target != NULL; target++)
@@ -227,11 +200,7 @@ bfd_check_format_matches (bfd *abfd, bfd
       abfd->xvec = *target;	/* Change BFD's target temporarily.  */
 
       if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
-	{
-	  if (matching)
-	    free (matching_vector);
-	  return FALSE;
-	}
+	goto err_ret;
 
       /* If _bfd_check_format neglects to set bfd_error, assume
 	 bfd_error_wrong_format.  We didn't used to even pay any
@@ -255,9 +224,8 @@ bfd_check_format_matches (bfd *abfd, bfd
 	      break;
 	    }
 
-	  if (matching)
+	  if (matching_vector)
 	    matching_vector[match_count] = temp;
-
 	  match_count++;
 	}
       else if ((err = bfd_get_error ()) == bfd_error_wrong_object_format
@@ -268,20 +236,12 @@ bfd_check_format_matches (bfd *abfd, bfd
 	     no better matches.  */
 	  if (ar_right_targ != bfd_default_vector[0])
 	    ar_right_targ = *target;
-	  if (matching)
+	  if (matching_vector)
 	    matching_vector[ar_match_index] = *target;
 	  ar_match_index++;
 	}
       else if (err != bfd_error_wrong_format)
-	{
-	  abfd->xvec = save_targ;
-	  abfd->format = bfd_unknown;
-
-	  if (matching)
-	    free (matching_vector);
-
-	  return FALSE;
-	}
+	goto err_ret;
     }
 
   if (match_count == 0)
@@ -297,16 +257,14 @@ bfd_check_format_matches (bfd *abfd, bfd
 	{
 	  match_count = ar_match_index - _bfd_target_vector_entries;
 
-	  if (matching && match_count > 1)
+	  if (matching_vector && match_count > 1)
 	    memcpy (matching_vector,
 		    matching_vector + _bfd_target_vector_entries,
 		    sizeof (*matching_vector) * match_count);
 	}
     }
 
-  if (match_count > 1
-      && bfd_associated_vector != NULL
-      && matching)
+  if (match_count > 1)
     {
       const bfd_target * const *assoc = bfd_associated_vector;
 
@@ -328,11 +286,9 @@ bfd_check_format_matches (bfd *abfd, bfd
 
   if (match_count == 1)
     {
+    ok_ret:
       abfd->xvec = right_targ;		/* Change BFD's target permanently.  */
 
-      if (matching)
-	free (matching_vector);
-
       /* If the file was opened for update, then `output_has_begun'
 	 some time ago when the file was created.  Do not recompute
 	 sections sizes or alignments in _bfd_set_section_contents.
@@ -341,37 +297,39 @@ bfd_check_format_matches (bfd *abfd, bfd
       if (abfd->direction == both_direction)
 	abfd->output_has_begun = TRUE;
 
+      if (matching_vector)
+	free (matching_vector);
       return TRUE;			/* File position has moved, BTW.  */
     }
 
-  abfd->xvec = save_targ;		/* Restore original target type.  */
-  abfd->format = bfd_unknown;		/* Restore original format.  */
-
   if (match_count == 0)
     {
+    err_unrecog:
       bfd_set_error (bfd_error_file_not_recognized);
-
-      if (matching)
+    err_ret:
+      abfd->xvec = save_targ;
+      abfd->format = bfd_unknown;
+      if (matching_vector)
 	free (matching_vector);
+      return FALSE;
     }
-  else
-    {
-      bfd_set_error (bfd_error_file_ambiguously_recognized);
 
-      if (matching)
+  abfd->xvec = save_targ;		/* Restore original target type.  */
+  abfd->format = bfd_unknown;		/* Restore original format.  */
+  bfd_set_error (bfd_error_file_ambiguously_recognized);
+
+  if (matching)
+    {
+      *matching = (char **) matching_vector;
+      matching_vector[match_count] = NULL;
+      /* Return target names.  This is a little nasty.  Maybe we
+	 should do another bfd_malloc?  */
+      while (--match_count >= 0)
 	{
-	  *matching = (char **) matching_vector;
-	  matching_vector[match_count] = NULL;
-	  /* Return target names.  This is a little nasty.  Maybe we
-	     should do another bfd_malloc?  */
-	  while (--match_count >= 0)
-	    {
-	      const char *name = matching_vector[match_count]->name;
-	      *(const char **) &matching_vector[match_count] = name;
-	    }
+	  const char *name = matching_vector[match_count]->name;
+	  *(const char **) &matching_vector[match_count] = name;
 	}
     }
-
   return FALSE;
 }