obj-elf.c revision 1.1 1 1.1 christos /* ELF object file format
2 1.1 christos Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 1.1 christos 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
4 1.1 christos Free Software Foundation, Inc.
5 1.1 christos
6 1.1 christos This file is part of GAS, the GNU Assembler.
7 1.1 christos
8 1.1 christos GAS is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as
10 1.1 christos published by the Free Software Foundation; either version 3,
11 1.1 christos or (at your option) any later version.
12 1.1 christos
13 1.1 christos GAS is distributed in the hope that it will be useful, but
14 1.1 christos WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
16 1.1 christos the GNU General Public License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.1 christos along with GAS; see the file COPYING. If not, write to the Free
20 1.1 christos Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 1.1 christos 02110-1301, USA. */
22 1.1 christos
23 1.1 christos #define OBJ_HEADER "obj-elf.h"
24 1.1 christos #include "as.h"
25 1.1 christos #include "safe-ctype.h"
26 1.1 christos #include "subsegs.h"
27 1.1 christos #include "obstack.h"
28 1.1 christos #include "struc-symbol.h"
29 1.1 christos #include "dwarf2dbg.h"
30 1.1 christos
31 1.1 christos #ifndef ECOFF_DEBUGGING
32 1.1 christos #define ECOFF_DEBUGGING 0
33 1.1 christos #else
34 1.1 christos #define NEED_ECOFF_DEBUG
35 1.1 christos #endif
36 1.1 christos
37 1.1 christos #ifdef NEED_ECOFF_DEBUG
38 1.1 christos #include "ecoff.h"
39 1.1 christos #endif
40 1.1 christos
41 1.1 christos #ifdef TC_ALPHA
42 1.1 christos #include "elf/alpha.h"
43 1.1 christos #endif
44 1.1 christos
45 1.1 christos #ifdef TC_MIPS
46 1.1 christos #include "elf/mips.h"
47 1.1 christos #endif
48 1.1 christos
49 1.1 christos #ifdef TC_PPC
50 1.1 christos #include "elf/ppc.h"
51 1.1 christos #endif
52 1.1 christos
53 1.1 christos #ifdef TC_I370
54 1.1 christos #include "elf/i370.h"
55 1.1 christos #endif
56 1.1 christos
57 1.1 christos #ifdef TC_I386
58 1.1 christos #include "elf/x86-64.h"
59 1.1 christos #endif
60 1.1 christos
61 1.1 christos #ifdef TC_MEP
62 1.1 christos #include "elf/mep.h"
63 1.1 christos #endif
64 1.1 christos
65 1.1 christos static void obj_elf_line (int);
66 1.1 christos static void obj_elf_size (int);
67 1.1 christos static void obj_elf_type (int);
68 1.1 christos static void obj_elf_ident (int);
69 1.1 christos static void obj_elf_weak (int);
70 1.1 christos static void obj_elf_local (int);
71 1.1 christos static void obj_elf_visibility (int);
72 1.1 christos static void obj_elf_symver (int);
73 1.1 christos static void obj_elf_subsection (int);
74 1.1 christos static void obj_elf_popsection (int);
75 1.1 christos static void obj_elf_tls_common (int);
76 1.1 christos static void obj_elf_lcomm (int);
77 1.1 christos static void obj_elf_struct (int);
78 1.1 christos
79 1.1 christos static const pseudo_typeS elf_pseudo_table[] =
80 1.1 christos {
81 1.1 christos {"comm", obj_elf_common, 0},
82 1.1 christos {"common", obj_elf_common, 1},
83 1.1 christos {"ident", obj_elf_ident, 0},
84 1.1 christos {"lcomm", obj_elf_lcomm, 0},
85 1.1 christos {"local", obj_elf_local, 0},
86 1.1 christos {"previous", obj_elf_previous, 0},
87 1.1 christos {"section", obj_elf_section, 0},
88 1.1 christos {"section.s", obj_elf_section, 0},
89 1.1 christos {"sect", obj_elf_section, 0},
90 1.1 christos {"sect.s", obj_elf_section, 0},
91 1.1 christos {"pushsection", obj_elf_section, 1},
92 1.1 christos {"popsection", obj_elf_popsection, 0},
93 1.1 christos {"size", obj_elf_size, 0},
94 1.1 christos {"type", obj_elf_type, 0},
95 1.1 christos {"version", obj_elf_version, 0},
96 1.1 christos {"weak", obj_elf_weak, 0},
97 1.1 christos
98 1.1 christos /* These define symbol visibility. */
99 1.1 christos {"internal", obj_elf_visibility, STV_INTERNAL},
100 1.1 christos {"hidden", obj_elf_visibility, STV_HIDDEN},
101 1.1 christos {"protected", obj_elf_visibility, STV_PROTECTED},
102 1.1 christos
103 1.1 christos /* These are used for stabs-in-elf configurations. */
104 1.1 christos {"line", obj_elf_line, 0},
105 1.1 christos
106 1.1 christos /* This is a GNU extension to handle symbol versions. */
107 1.1 christos {"symver", obj_elf_symver, 0},
108 1.1 christos
109 1.1 christos /* A GNU extension to change subsection only. */
110 1.1 christos {"subsection", obj_elf_subsection, 0},
111 1.1 christos
112 1.1 christos /* These are GNU extensions to aid in garbage collecting C++ vtables. */
113 1.1 christos {"vtable_inherit", (void (*) (int)) &obj_elf_vtable_inherit, 0},
114 1.1 christos {"vtable_entry", (void (*) (int)) &obj_elf_vtable_entry, 0},
115 1.1 christos
116 1.1 christos /* These are used for dwarf. */
117 1.1 christos {"2byte", cons, 2},
118 1.1 christos {"4byte", cons, 4},
119 1.1 christos {"8byte", cons, 8},
120 1.1 christos /* These are used for dwarf2. */
121 1.1 christos { "file", (void (*) (int)) dwarf2_directive_file, 0 },
122 1.1 christos { "loc", dwarf2_directive_loc, 0 },
123 1.1 christos { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
124 1.1 christos
125 1.1 christos /* We need to trap the section changing calls to handle .previous. */
126 1.1 christos {"data", obj_elf_data, 0},
127 1.1 christos {"offset", obj_elf_struct, 0},
128 1.1 christos {"struct", obj_elf_struct, 0},
129 1.1 christos {"text", obj_elf_text, 0},
130 1.1 christos
131 1.1 christos {"tls_common", obj_elf_tls_common, 0},
132 1.1 christos
133 1.1 christos /* End sentinel. */
134 1.1 christos {NULL, NULL, 0},
135 1.1 christos };
136 1.1 christos
137 1.1 christos static const pseudo_typeS ecoff_debug_pseudo_table[] =
138 1.1 christos {
139 1.1 christos #ifdef NEED_ECOFF_DEBUG
140 1.1 christos /* COFF style debugging information for ECOFF. .ln is not used; .loc
141 1.1 christos is used instead. */
142 1.1 christos { "def", ecoff_directive_def, 0 },
143 1.1 christos { "dim", ecoff_directive_dim, 0 },
144 1.1 christos { "endef", ecoff_directive_endef, 0 },
145 1.1 christos { "file", ecoff_directive_file, 0 },
146 1.1 christos { "scl", ecoff_directive_scl, 0 },
147 1.1 christos { "tag", ecoff_directive_tag, 0 },
148 1.1 christos { "val", ecoff_directive_val, 0 },
149 1.1 christos
150 1.1 christos /* COFF debugging requires pseudo-ops .size and .type, but ELF
151 1.1 christos already has meanings for those. We use .esize and .etype
152 1.1 christos instead. These are only generated by gcc anyhow. */
153 1.1 christos { "esize", ecoff_directive_size, 0 },
154 1.1 christos { "etype", ecoff_directive_type, 0 },
155 1.1 christos
156 1.1 christos /* ECOFF specific debugging information. */
157 1.1 christos { "begin", ecoff_directive_begin, 0 },
158 1.1 christos { "bend", ecoff_directive_bend, 0 },
159 1.1 christos { "end", ecoff_directive_end, 0 },
160 1.1 christos { "ent", ecoff_directive_ent, 0 },
161 1.1 christos { "fmask", ecoff_directive_fmask, 0 },
162 1.1 christos { "frame", ecoff_directive_frame, 0 },
163 1.1 christos { "loc", ecoff_directive_loc, 0 },
164 1.1 christos { "mask", ecoff_directive_mask, 0 },
165 1.1 christos
166 1.1 christos /* Other ECOFF directives. */
167 1.1 christos { "extern", ecoff_directive_extern, 0 },
168 1.1 christos
169 1.1 christos /* These are used on Irix. I don't know how to implement them. */
170 1.1 christos { "alias", s_ignore, 0 },
171 1.1 christos { "bgnb", s_ignore, 0 },
172 1.1 christos { "endb", s_ignore, 0 },
173 1.1 christos { "lab", s_ignore, 0 },
174 1.1 christos { "noalias", s_ignore, 0 },
175 1.1 christos { "verstamp", s_ignore, 0 },
176 1.1 christos { "vreg", s_ignore, 0 },
177 1.1 christos #endif
178 1.1 christos
179 1.1 christos {NULL, NULL, 0} /* end sentinel */
180 1.1 christos };
181 1.1 christos
182 1.1 christos #undef NO_RELOC
183 1.1 christos #include "aout/aout64.h"
184 1.1 christos
185 1.1 christos /* This is called when the assembler starts. */
186 1.1 christos
187 1.1 christos asection *elf_com_section_ptr;
188 1.1 christos
189 1.1 christos void
190 1.1 christos elf_begin (void)
191 1.1 christos {
192 1.1 christos asection *s;
193 1.1 christos
194 1.1 christos /* Add symbols for the known sections to the symbol table. */
195 1.1 christos s = bfd_get_section_by_name (stdoutput, TEXT_SECTION_NAME);
196 1.1 christos symbol_table_insert (section_symbol (s));
197 1.1 christos s = bfd_get_section_by_name (stdoutput, DATA_SECTION_NAME);
198 1.1 christos symbol_table_insert (section_symbol (s));
199 1.1 christos s = bfd_get_section_by_name (stdoutput, BSS_SECTION_NAME);
200 1.1 christos symbol_table_insert (section_symbol (s));
201 1.1 christos elf_com_section_ptr = bfd_com_section_ptr;
202 1.1 christos }
203 1.1 christos
204 1.1 christos void
205 1.1 christos elf_pop_insert (void)
206 1.1 christos {
207 1.1 christos pop_insert (elf_pseudo_table);
208 1.1 christos if (ECOFF_DEBUGGING)
209 1.1 christos pop_insert (ecoff_debug_pseudo_table);
210 1.1 christos }
211 1.1 christos
212 1.1 christos static bfd_vma
213 1.1 christos elf_s_get_size (symbolS *sym)
214 1.1 christos {
215 1.1 christos return S_GET_SIZE (sym);
216 1.1 christos }
217 1.1 christos
218 1.1 christos static void
219 1.1 christos elf_s_set_size (symbolS *sym, bfd_vma sz)
220 1.1 christos {
221 1.1 christos S_SET_SIZE (sym, sz);
222 1.1 christos }
223 1.1 christos
224 1.1 christos static bfd_vma
225 1.1 christos elf_s_get_align (symbolS *sym)
226 1.1 christos {
227 1.1 christos return S_GET_ALIGN (sym);
228 1.1 christos }
229 1.1 christos
230 1.1 christos static void
231 1.1 christos elf_s_set_align (symbolS *sym, bfd_vma align)
232 1.1 christos {
233 1.1 christos S_SET_ALIGN (sym, align);
234 1.1 christos }
235 1.1 christos
236 1.1 christos int
237 1.1 christos elf_s_get_other (symbolS *sym)
238 1.1 christos {
239 1.1 christos return elf_symbol (symbol_get_bfdsym (sym))->internal_elf_sym.st_other;
240 1.1 christos }
241 1.1 christos
242 1.1 christos static void
243 1.1 christos elf_s_set_other (symbolS *sym, int other)
244 1.1 christos {
245 1.1 christos S_SET_OTHER (sym, other);
246 1.1 christos }
247 1.1 christos
248 1.1 christos static int
249 1.1 christos elf_sec_sym_ok_for_reloc (asection *sec)
250 1.1 christos {
251 1.1 christos return obj_sec_sym_ok_for_reloc (sec);
252 1.1 christos }
253 1.1 christos
254 1.1 christos void
255 1.1 christos elf_file_symbol (const char *s, int appfile)
256 1.1 christos {
257 1.1 christos if (!appfile
258 1.1 christos || symbol_rootP == NULL
259 1.1 christos || symbol_rootP->bsym == NULL
260 1.1 christos || (symbol_rootP->bsym->flags & BSF_FILE) == 0)
261 1.1 christos {
262 1.1 christos symbolS *sym;
263 1.1 christos unsigned int name_length;
264 1.1 christos
265 1.1 christos sym = symbol_new (s, absolute_section, 0, NULL);
266 1.1 christos symbol_set_frag (sym, &zero_address_frag);
267 1.1 christos
268 1.1 christos name_length = strlen (s);
269 1.1 christos if (name_length > strlen (S_GET_NAME (sym)))
270 1.1 christos {
271 1.1 christos obstack_grow (¬es, s, name_length + 1);
272 1.1 christos S_SET_NAME (sym, (const char *) obstack_finish (¬es));
273 1.1 christos }
274 1.1 christos else
275 1.1 christos strcpy ((char *) S_GET_NAME (sym), s);
276 1.1 christos
277 1.1 christos symbol_get_bfdsym (sym)->flags |= BSF_FILE;
278 1.1 christos
279 1.1 christos if (symbol_rootP != sym)
280 1.1 christos {
281 1.1 christos symbol_remove (sym, &symbol_rootP, &symbol_lastP);
282 1.1 christos symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP);
283 1.1 christos #ifdef DEBUG
284 1.1 christos verify_symbol_chain (symbol_rootP, symbol_lastP);
285 1.1 christos #endif
286 1.1 christos }
287 1.1 christos }
288 1.1 christos
289 1.1 christos #ifdef NEED_ECOFF_DEBUG
290 1.1 christos ecoff_new_file (s, appfile);
291 1.1 christos #endif
292 1.1 christos }
293 1.1 christos
294 1.1 christos /* Called from read.c:s_comm after we've parsed .comm symbol, size.
295 1.1 christos Parse a possible alignment value. */
296 1.1 christos
297 1.1 christos symbolS *
298 1.1 christos elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size)
299 1.1 christos {
300 1.1 christos addressT align = 0;
301 1.1 christos int is_local = symbol_get_obj (symbolP)->local;
302 1.1 christos
303 1.1 christos if (*input_line_pointer == ',')
304 1.1 christos {
305 1.1 christos char *save = input_line_pointer;
306 1.1 christos
307 1.1 christos input_line_pointer++;
308 1.1 christos SKIP_WHITESPACE ();
309 1.1 christos
310 1.1 christos if (*input_line_pointer == '"')
311 1.1 christos {
312 1.1 christos /* For sparc. Accept .common symbol, length, "bss" */
313 1.1 christos input_line_pointer++;
314 1.1 christos /* Some use the dot, some don't. */
315 1.1 christos if (*input_line_pointer == '.')
316 1.1 christos input_line_pointer++;
317 1.1 christos /* Some say data, some say bss. */
318 1.1 christos if (strncmp (input_line_pointer, "bss\"", 4) == 0)
319 1.1 christos input_line_pointer += 4;
320 1.1 christos else if (strncmp (input_line_pointer, "data\"", 5) == 0)
321 1.1 christos input_line_pointer += 5;
322 1.1 christos else
323 1.1 christos {
324 1.1 christos char *p = input_line_pointer;
325 1.1 christos char c;
326 1.1 christos
327 1.1 christos while (*--p != '"')
328 1.1 christos ;
329 1.1 christos while (!is_end_of_line[(unsigned char) *input_line_pointer])
330 1.1 christos if (*input_line_pointer++ == '"')
331 1.1 christos break;
332 1.1 christos c = *input_line_pointer;
333 1.1 christos *input_line_pointer = '\0';
334 1.1 christos as_bad (_("bad .common segment %s"), p);
335 1.1 christos *input_line_pointer = c;
336 1.1 christos ignore_rest_of_line ();
337 1.1 christos return NULL;
338 1.1 christos }
339 1.1 christos /* ??? Don't ask me why these are always global. */
340 1.1 christos is_local = 0;
341 1.1 christos }
342 1.1 christos else
343 1.1 christos {
344 1.1 christos input_line_pointer = save;
345 1.1 christos align = parse_align (is_local);
346 1.1 christos if (align == (addressT) -1)
347 1.1 christos return NULL;
348 1.1 christos }
349 1.1 christos }
350 1.1 christos
351 1.1 christos if (is_local)
352 1.1 christos {
353 1.1 christos bss_alloc (symbolP, size, align);
354 1.1 christos S_CLEAR_EXTERNAL (symbolP);
355 1.1 christos }
356 1.1 christos else
357 1.1 christos {
358 1.1 christos S_SET_VALUE (symbolP, size);
359 1.1 christos S_SET_ALIGN (symbolP, align);
360 1.1 christos S_SET_EXTERNAL (symbolP);
361 1.1 christos S_SET_SEGMENT (symbolP, elf_com_section_ptr);
362 1.1 christos }
363 1.1 christos
364 1.1 christos symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
365 1.1 christos
366 1.1 christos return symbolP;
367 1.1 christos }
368 1.1 christos
369 1.1 christos void
370 1.1 christos obj_elf_common (int is_common)
371 1.1 christos {
372 1.1 christos if (flag_mri && is_common)
373 1.1 christos s_mri_common (0);
374 1.1 christos else
375 1.1 christos s_comm_internal (0, elf_common_parse);
376 1.1 christos }
377 1.1 christos
378 1.1 christos static void
379 1.1 christos obj_elf_tls_common (int ignore ATTRIBUTE_UNUSED)
380 1.1 christos {
381 1.1 christos symbolS *symbolP = s_comm_internal (0, elf_common_parse);
382 1.1 christos
383 1.1 christos if (symbolP)
384 1.1 christos symbol_get_bfdsym (symbolP)->flags |= BSF_THREAD_LOCAL;
385 1.1 christos }
386 1.1 christos
387 1.1 christos static void
388 1.1 christos obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED)
389 1.1 christos {
390 1.1 christos symbolS *symbolP = s_comm_internal (0, s_lcomm_internal);
391 1.1 christos
392 1.1 christos if (symbolP)
393 1.1 christos symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
394 1.1 christos }
395 1.1 christos
396 1.1 christos static symbolS *
397 1.1 christos get_sym_from_input_line_and_check (void)
398 1.1 christos {
399 1.1 christos char *name;
400 1.1 christos char c;
401 1.1 christos symbolS *sym;
402 1.1 christos
403 1.1 christos name = input_line_pointer;
404 1.1 christos c = get_symbol_end ();
405 1.1 christos sym = symbol_find_or_make (name);
406 1.1 christos *input_line_pointer = c;
407 1.1 christos SKIP_WHITESPACE ();
408 1.1 christos
409 1.1 christos /* There is no symbol name if input_line_pointer has not moved. */
410 1.1 christos if (name == input_line_pointer)
411 1.1 christos as_bad (_("Missing symbol name in directive"));
412 1.1 christos return sym;
413 1.1 christos }
414 1.1 christos
415 1.1 christos static void
416 1.1 christos obj_elf_local (int ignore ATTRIBUTE_UNUSED)
417 1.1 christos {
418 1.1 christos int c;
419 1.1 christos symbolS *symbolP;
420 1.1 christos
421 1.1 christos do
422 1.1 christos {
423 1.1 christos symbolP = get_sym_from_input_line_and_check ();
424 1.1 christos c = *input_line_pointer;
425 1.1 christos S_CLEAR_EXTERNAL (symbolP);
426 1.1 christos symbol_get_obj (symbolP)->local = 1;
427 1.1 christos if (c == ',')
428 1.1 christos {
429 1.1 christos input_line_pointer++;
430 1.1 christos SKIP_WHITESPACE ();
431 1.1 christos if (*input_line_pointer == '\n')
432 1.1 christos c = '\n';
433 1.1 christos }
434 1.1 christos }
435 1.1 christos while (c == ',');
436 1.1 christos demand_empty_rest_of_line ();
437 1.1 christos }
438 1.1 christos
439 1.1 christos static void
440 1.1 christos obj_elf_weak (int ignore ATTRIBUTE_UNUSED)
441 1.1 christos {
442 1.1 christos int c;
443 1.1 christos symbolS *symbolP;
444 1.1 christos
445 1.1 christos do
446 1.1 christos {
447 1.1 christos symbolP = get_sym_from_input_line_and_check ();
448 1.1 christos c = *input_line_pointer;
449 1.1 christos S_SET_WEAK (symbolP);
450 1.1 christos if (c == ',')
451 1.1 christos {
452 1.1 christos input_line_pointer++;
453 1.1 christos SKIP_WHITESPACE ();
454 1.1 christos if (*input_line_pointer == '\n')
455 1.1 christos c = '\n';
456 1.1 christos }
457 1.1 christos }
458 1.1 christos while (c == ',');
459 1.1 christos demand_empty_rest_of_line ();
460 1.1 christos }
461 1.1 christos
462 1.1 christos static void
463 1.1 christos obj_elf_visibility (int visibility)
464 1.1 christos {
465 1.1 christos int c;
466 1.1 christos symbolS *symbolP;
467 1.1 christos asymbol *bfdsym;
468 1.1 christos elf_symbol_type *elfsym;
469 1.1 christos
470 1.1 christos do
471 1.1 christos {
472 1.1 christos symbolP = get_sym_from_input_line_and_check ();
473 1.1 christos
474 1.1 christos bfdsym = symbol_get_bfdsym (symbolP);
475 1.1 christos elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
476 1.1 christos
477 1.1 christos gas_assert (elfsym);
478 1.1 christos
479 1.1 christos elfsym->internal_elf_sym.st_other &= ~3;
480 1.1 christos elfsym->internal_elf_sym.st_other |= visibility;
481 1.1 christos
482 1.1 christos c = *input_line_pointer;
483 1.1 christos if (c == ',')
484 1.1 christos {
485 1.1 christos input_line_pointer ++;
486 1.1 christos
487 1.1 christos SKIP_WHITESPACE ();
488 1.1 christos
489 1.1 christos if (*input_line_pointer == '\n')
490 1.1 christos c = '\n';
491 1.1 christos }
492 1.1 christos }
493 1.1 christos while (c == ',');
494 1.1 christos
495 1.1 christos demand_empty_rest_of_line ();
496 1.1 christos }
497 1.1 christos
498 1.1 christos static segT previous_section;
499 1.1 christos static int previous_subsection;
500 1.1 christos
501 1.1 christos struct section_stack
502 1.1 christos {
503 1.1 christos struct section_stack *next;
504 1.1 christos segT seg, prev_seg;
505 1.1 christos int subseg, prev_subseg;
506 1.1 christos };
507 1.1 christos
508 1.1 christos static struct section_stack *section_stack;
509 1.1 christos
510 1.1 christos static bfd_boolean
511 1.1 christos get_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
512 1.1 christos {
513 1.1 christos const char *gname = (const char *) inf;
514 1.1 christos const char *group_name = elf_group_name (sec);
515 1.1 christos
516 1.1 christos return (group_name == gname
517 1.1 christos || (group_name != NULL
518 1.1 christos && gname != NULL
519 1.1 christos && strcmp (group_name, gname) == 0));
520 1.1 christos }
521 1.1 christos
522 1.1 christos /* Handle the .section pseudo-op. This code supports two different
523 1.1 christos syntaxes.
524 1.1 christos
525 1.1 christos The first is found on Solaris, and looks like
526 1.1 christos .section ".sec1",#alloc,#execinstr,#write
527 1.1 christos Here the names after '#' are the SHF_* flags to turn on for the
528 1.1 christos section. I'm not sure how it determines the SHT_* type (BFD
529 1.1 christos doesn't really give us control over the type, anyhow).
530 1.1 christos
531 1.1 christos The second format is found on UnixWare, and probably most SVR4
532 1.1 christos machines, and looks like
533 1.1 christos .section .sec1,"a",@progbits
534 1.1 christos The quoted string may contain any combination of a, w, x, and
535 1.1 christos represents the SHF_* flags to turn on for the section. The string
536 1.1 christos beginning with '@' can be progbits or nobits. There should be
537 1.1 christos other possibilities, but I don't know what they are. In any case,
538 1.1 christos BFD doesn't really let us set the section type. */
539 1.1 christos
540 1.1 christos void
541 1.1 christos obj_elf_change_section (const char *name,
542 1.1 christos int type,
543 1.1 christos bfd_vma attr,
544 1.1 christos int entsize,
545 1.1 christos const char *group_name,
546 1.1 christos int linkonce,
547 1.1 christos int push)
548 1.1 christos {
549 1.1 christos asection *old_sec;
550 1.1 christos segT sec;
551 1.1 christos flagword flags;
552 1.1 christos const struct elf_backend_data *bed;
553 1.1 christos const struct bfd_elf_special_section *ssect;
554 1.1 christos
555 1.1 christos #ifdef md_flush_pending_output
556 1.1 christos md_flush_pending_output ();
557 1.1 christos #endif
558 1.1 christos
559 1.1 christos /* Switch to the section, creating it if necessary. */
560 1.1 christos if (push)
561 1.1 christos {
562 1.1 christos struct section_stack *elt;
563 1.1 christos elt = (struct section_stack *) xmalloc (sizeof (struct section_stack));
564 1.1 christos elt->next = section_stack;
565 1.1 christos elt->seg = now_seg;
566 1.1 christos elt->prev_seg = previous_section;
567 1.1 christos elt->subseg = now_subseg;
568 1.1 christos elt->prev_subseg = previous_subsection;
569 1.1 christos section_stack = elt;
570 1.1 christos }
571 1.1 christos previous_section = now_seg;
572 1.1 christos previous_subsection = now_subseg;
573 1.1 christos
574 1.1 christos old_sec = bfd_get_section_by_name_if (stdoutput, name, get_section,
575 1.1 christos (void *) group_name);
576 1.1 christos if (old_sec)
577 1.1 christos {
578 1.1 christos sec = old_sec;
579 1.1 christos subseg_set (sec, 0);
580 1.1 christos }
581 1.1 christos else
582 1.1 christos sec = subseg_force_new (name, 0);
583 1.1 christos
584 1.1 christos bed = get_elf_backend_data (stdoutput);
585 1.1 christos ssect = (*bed->get_sec_type_attr) (stdoutput, sec);
586 1.1 christos
587 1.1 christos if (ssect != NULL)
588 1.1 christos {
589 1.1 christos bfd_boolean override = FALSE;
590 1.1 christos
591 1.1 christos if (type == SHT_NULL)
592 1.1 christos type = ssect->type;
593 1.1 christos else if (type != ssect->type)
594 1.1 christos {
595 1.1 christos if (old_sec == NULL
596 1.1 christos /* Some older versions of gcc will emit
597 1.1 christos
598 1.1 christos .section .init_array,"aw",@progbits
599 1.1 christos
600 1.1 christos for __attribute__ ((section (".init_array"))).
601 1.1 christos "@progbits" is incorrect. Also for x86-64 large bss
602 1.1 christos sections, some older versions of gcc will emit
603 1.1 christos
604 1.1 christos .section .lbss,"aw",@progbits
605 1.1 christos
606 1.1 christos "@progbits" is incorrect. */
607 1.1 christos #ifdef TC_I386
608 1.1 christos && (bed->s->arch_size != 64
609 1.1 christos || !(ssect->attr & SHF_X86_64_LARGE))
610 1.1 christos #endif
611 1.1 christos && ssect->type != SHT_INIT_ARRAY
612 1.1 christos && ssect->type != SHT_FINI_ARRAY
613 1.1 christos && ssect->type != SHT_PREINIT_ARRAY)
614 1.1 christos {
615 1.1 christos /* We allow to specify any type for a .note section. */
616 1.1 christos if (ssect->type != SHT_NOTE)
617 1.1 christos as_warn (_("setting incorrect section type for %s"),
618 1.1 christos name);
619 1.1 christos }
620 1.1 christos else
621 1.1 christos {
622 1.1 christos as_warn (_("ignoring incorrect section type for %s"),
623 1.1 christos name);
624 1.1 christos type = ssect->type;
625 1.1 christos }
626 1.1 christos }
627 1.1 christos
628 1.1 christos if (old_sec == NULL && (attr & ~ssect->attr) != 0)
629 1.1 christos {
630 1.1 christos /* As a GNU extension, we permit a .note section to be
631 1.1 christos allocatable. If the linker sees an allocatable .note
632 1.1 christos section, it will create a PT_NOTE segment in the output
633 1.1 christos file. We also allow "x" for .note.GNU-stack. */
634 1.1 christos if (ssect->type == SHT_NOTE
635 1.1 christos && (attr == SHF_ALLOC || attr == SHF_EXECINSTR))
636 1.1 christos ;
637 1.1 christos /* Allow different SHF_MERGE and SHF_STRINGS if we have
638 1.1 christos something like .rodata.str. */
639 1.1 christos else if (ssect->suffix_length == -2
640 1.1 christos && name[ssect->prefix_length] == '.'
641 1.1 christos && (attr
642 1.1 christos & ~ssect->attr
643 1.1 christos & ~SHF_MERGE
644 1.1 christos & ~SHF_STRINGS) == 0)
645 1.1 christos ;
646 1.1 christos /* .interp, .strtab and .symtab can have SHF_ALLOC. */
647 1.1 christos else if (attr == SHF_ALLOC
648 1.1 christos && (strcmp (name, ".interp") == 0
649 1.1 christos || strcmp (name, ".strtab") == 0
650 1.1 christos || strcmp (name, ".symtab") == 0))
651 1.1 christos override = TRUE;
652 1.1 christos /* .note.GNU-stack can have SHF_EXECINSTR. */
653 1.1 christos else if (attr == SHF_EXECINSTR
654 1.1 christos && strcmp (name, ".note.GNU-stack") == 0)
655 1.1 christos override = TRUE;
656 1.1 christos #ifdef TC_ALPHA
657 1.1 christos /* A section on Alpha may have SHF_ALPHA_GPREL. */
658 1.1 christos else if ((attr & ~ssect->attr) == SHF_ALPHA_GPREL)
659 1.1 christos override = TRUE;
660 1.1 christos #endif
661 1.1 christos else
662 1.1 christos {
663 1.1 christos if (group_name == NULL)
664 1.1 christos as_warn (_("setting incorrect section attributes for %s"),
665 1.1 christos name);
666 1.1 christos override = TRUE;
667 1.1 christos }
668 1.1 christos }
669 1.1 christos if (!override && old_sec == NULL)
670 1.1 christos attr |= ssect->attr;
671 1.1 christos }
672 1.1 christos
673 1.1 christos /* Convert ELF type and flags to BFD flags. */
674 1.1 christos flags = (SEC_RELOC
675 1.1 christos | ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
676 1.1 christos | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
677 1.1 christos | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
678 1.1 christos | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0)
679 1.1 christos | ((attr & SHF_MERGE) ? SEC_MERGE : 0)
680 1.1 christos | ((attr & SHF_STRINGS) ? SEC_STRINGS : 0)
681 1.1 christos | ((attr & SHF_EXCLUDE) ? SEC_EXCLUDE: 0)
682 1.1 christos | ((attr & SHF_TLS) ? SEC_THREAD_LOCAL : 0));
683 1.1 christos #ifdef md_elf_section_flags
684 1.1 christos flags = md_elf_section_flags (flags, attr, type);
685 1.1 christos #endif
686 1.1 christos
687 1.1 christos if (linkonce)
688 1.1 christos flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
689 1.1 christos
690 1.1 christos if (old_sec == NULL)
691 1.1 christos {
692 1.1 christos symbolS *secsym;
693 1.1 christos
694 1.1 christos if (type == SHT_NULL)
695 1.1 christos type = bfd_elf_get_default_section_type (flags);
696 1.1 christos elf_section_type (sec) = type;
697 1.1 christos elf_section_flags (sec) = attr;
698 1.1 christos
699 1.1 christos /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
700 1.1 christos if (type == SHT_NOBITS)
701 1.1 christos seg_info (sec)->bss = 1;
702 1.1 christos
703 1.1 christos bfd_set_section_flags (stdoutput, sec, flags);
704 1.1 christos if (flags & SEC_MERGE)
705 1.1 christos sec->entsize = entsize;
706 1.1 christos elf_group_name (sec) = group_name;
707 1.1 christos
708 1.1 christos /* Add a symbol for this section to the symbol table. */
709 1.1 christos secsym = symbol_find (name);
710 1.1 christos if (secsym != NULL)
711 1.1 christos symbol_set_bfdsym (secsym, sec->symbol);
712 1.1 christos else
713 1.1 christos symbol_table_insert (section_symbol (sec));
714 1.1 christos }
715 1.1 christos else
716 1.1 christos {
717 1.1 christos if (type != SHT_NULL
718 1.1 christos && (unsigned) type != elf_section_type (old_sec))
719 1.1 christos as_warn (_("ignoring changed section type for %s"), name);
720 1.1 christos
721 1.1 christos if (attr != 0)
722 1.1 christos {
723 1.1 christos /* If section attributes are specified the second time we see a
724 1.1 christos particular section, then check that they are the same as we
725 1.1 christos saw the first time. */
726 1.1 christos if (((old_sec->flags ^ flags)
727 1.1 christos & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
728 1.1 christos | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
729 1.1 christos | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
730 1.1 christos | SEC_THREAD_LOCAL)))
731 1.1 christos as_warn (_("ignoring changed section attributes for %s"), name);
732 1.1 christos if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
733 1.1 christos as_warn (_("ignoring changed section entity size for %s"), name);
734 1.1 christos }
735 1.1 christos }
736 1.1 christos
737 1.1 christos #ifdef md_elf_section_change_hook
738 1.1 christos md_elf_section_change_hook ();
739 1.1 christos #endif
740 1.1 christos }
741 1.1 christos
742 1.1 christos static bfd_vma
743 1.1 christos obj_elf_parse_section_letters (char *str, size_t len, bfd_boolean *is_clone)
744 1.1 christos {
745 1.1 christos bfd_vma attr = 0;
746 1.1 christos *is_clone = FALSE;
747 1.1 christos
748 1.1 christos while (len > 0)
749 1.1 christos {
750 1.1 christos switch (*str)
751 1.1 christos {
752 1.1 christos case 'a':
753 1.1 christos attr |= SHF_ALLOC;
754 1.1 christos break;
755 1.1 christos case 'e':
756 1.1 christos attr |= SHF_EXCLUDE;
757 1.1 christos break;
758 1.1 christos case 'w':
759 1.1 christos attr |= SHF_WRITE;
760 1.1 christos break;
761 1.1 christos case 'x':
762 1.1 christos attr |= SHF_EXECINSTR;
763 1.1 christos break;
764 1.1 christos case 'M':
765 1.1 christos attr |= SHF_MERGE;
766 1.1 christos break;
767 1.1 christos case 'S':
768 1.1 christos attr |= SHF_STRINGS;
769 1.1 christos break;
770 1.1 christos case 'G':
771 1.1 christos attr |= SHF_GROUP;
772 1.1 christos break;
773 1.1 christos case 'T':
774 1.1 christos attr |= SHF_TLS;
775 1.1 christos break;
776 1.1 christos case '?':
777 1.1 christos *is_clone = TRUE;
778 1.1 christos break;
779 1.1 christos /* Compatibility. */
780 1.1 christos case 'm':
781 1.1 christos if (*(str - 1) == 'a')
782 1.1 christos {
783 1.1 christos attr |= SHF_MERGE;
784 1.1 christos if (len > 1 && str[1] == 's')
785 1.1 christos {
786 1.1 christos attr |= SHF_STRINGS;
787 1.1 christos str++, len--;
788 1.1 christos }
789 1.1 christos break;
790 1.1 christos }
791 1.1 christos default:
792 1.1 christos {
793 1.1 christos char *bad_msg = _("unrecognized .section attribute: want a,e,w,x,M,S,G,T");
794 1.1 christos #ifdef md_elf_section_letter
795 1.1 christos bfd_vma md_attr = md_elf_section_letter (*str, &bad_msg);
796 1.1 christos if (md_attr != (bfd_vma) -1)
797 1.1 christos attr |= md_attr;
798 1.1 christos else
799 1.1 christos #endif
800 1.1 christos as_fatal ("%s", bad_msg);
801 1.1 christos }
802 1.1 christos break;
803 1.1 christos }
804 1.1 christos str++, len--;
805 1.1 christos }
806 1.1 christos
807 1.1 christos return attr;
808 1.1 christos }
809 1.1 christos
810 1.1 christos static int
811 1.1 christos obj_elf_section_type (char *str, size_t len, bfd_boolean warn)
812 1.1 christos {
813 1.1 christos if (len == 8 && strncmp (str, "progbits", 8) == 0)
814 1.1 christos return SHT_PROGBITS;
815 1.1 christos if (len == 6 && strncmp (str, "nobits", 6) == 0)
816 1.1 christos return SHT_NOBITS;
817 1.1 christos if (len == 4 && strncmp (str, "note", 4) == 0)
818 1.1 christos return SHT_NOTE;
819 1.1 christos if (len == 10 && strncmp (str, "init_array", 10) == 0)
820 1.1 christos return SHT_INIT_ARRAY;
821 1.1 christos if (len == 10 && strncmp (str, "fini_array", 10) == 0)
822 1.1 christos return SHT_FINI_ARRAY;
823 1.1 christos if (len == 13 && strncmp (str, "preinit_array", 13) == 0)
824 1.1 christos return SHT_PREINIT_ARRAY;
825 1.1 christos
826 1.1 christos #ifdef md_elf_section_type
827 1.1 christos {
828 1.1 christos int md_type = md_elf_section_type (str, len);
829 1.1 christos if (md_type >= 0)
830 1.1 christos return md_type;
831 1.1 christos }
832 1.1 christos #endif
833 1.1 christos
834 1.1 christos if (warn)
835 1.1 christos as_warn (_("unrecognized section type"));
836 1.1 christos return 0;
837 1.1 christos }
838 1.1 christos
839 1.1 christos static bfd_vma
840 1.1 christos obj_elf_section_word (char *str, size_t len, int *type)
841 1.1 christos {
842 1.1 christos int ret;
843 1.1 christos
844 1.1 christos if (len == 5 && strncmp (str, "write", 5) == 0)
845 1.1 christos return SHF_WRITE;
846 1.1 christos if (len == 5 && strncmp (str, "alloc", 5) == 0)
847 1.1 christos return SHF_ALLOC;
848 1.1 christos if (len == 9 && strncmp (str, "execinstr", 9) == 0)
849 1.1 christos return SHF_EXECINSTR;
850 1.1 christos if (len == 7 && strncmp (str, "exclude", 7) == 0)
851 1.1 christos return SHF_EXCLUDE;
852 1.1 christos if (len == 3 && strncmp (str, "tls", 3) == 0)
853 1.1 christos return SHF_TLS;
854 1.1 christos
855 1.1 christos #ifdef md_elf_section_word
856 1.1 christos {
857 1.1 christos bfd_vma md_attr = md_elf_section_word (str, len);
858 1.1 christos if (md_attr > 0)
859 1.1 christos return md_attr;
860 1.1 christos }
861 1.1 christos #endif
862 1.1 christos
863 1.1 christos ret = obj_elf_section_type (str, len, FALSE);
864 1.1 christos if (ret != 0)
865 1.1 christos *type = ret;
866 1.1 christos else
867 1.1 christos as_warn (_("unrecognized section attribute"));
868 1.1 christos
869 1.1 christos return 0;
870 1.1 christos }
871 1.1 christos
872 1.1 christos /* Get name of section. */
873 1.1 christos char *
874 1.1 christos obj_elf_section_name (void)
875 1.1 christos {
876 1.1 christos char *name;
877 1.1 christos
878 1.1 christos SKIP_WHITESPACE ();
879 1.1 christos if (*input_line_pointer == '"')
880 1.1 christos {
881 1.1 christos int dummy;
882 1.1 christos
883 1.1 christos name = demand_copy_C_string (&dummy);
884 1.1 christos if (name == NULL)
885 1.1 christos {
886 1.1 christos ignore_rest_of_line ();
887 1.1 christos return NULL;
888 1.1 christos }
889 1.1 christos }
890 1.1 christos else
891 1.1 christos {
892 1.1 christos char *end = input_line_pointer;
893 1.1 christos
894 1.1 christos while (0 == strchr ("\n\t,; ", *end))
895 1.1 christos end++;
896 1.1 christos if (end == input_line_pointer)
897 1.1 christos {
898 1.1 christos as_bad (_("missing name"));
899 1.1 christos ignore_rest_of_line ();
900 1.1 christos return NULL;
901 1.1 christos }
902 1.1 christos
903 1.1 christos name = (char *) xmalloc (end - input_line_pointer + 1);
904 1.1 christos memcpy (name, input_line_pointer, end - input_line_pointer);
905 1.1 christos name[end - input_line_pointer] = '\0';
906 1.1 christos #ifdef tc_canonicalize_section_name
907 1.1 christos name = tc_canonicalize_section_name (name);
908 1.1 christos #endif
909 1.1 christos input_line_pointer = end;
910 1.1 christos }
911 1.1 christos SKIP_WHITESPACE ();
912 1.1 christos return name;
913 1.1 christos }
914 1.1 christos
915 1.1 christos void
916 1.1 christos obj_elf_section (int push)
917 1.1 christos {
918 1.1 christos char *name, *group_name, *beg;
919 1.1 christos int type, dummy;
920 1.1 christos bfd_vma attr;
921 1.1 christos int entsize;
922 1.1 christos int linkonce;
923 1.1 christos subsegT new_subsection = -1;
924 1.1 christos
925 1.1 christos #ifndef TC_I370
926 1.1 christos if (flag_mri)
927 1.1 christos {
928 1.1 christos char mri_type;
929 1.1 christos
930 1.1 christos #ifdef md_flush_pending_output
931 1.1 christos md_flush_pending_output ();
932 1.1 christos #endif
933 1.1 christos
934 1.1 christos previous_section = now_seg;
935 1.1 christos previous_subsection = now_subseg;
936 1.1 christos
937 1.1 christos s_mri_sect (&mri_type);
938 1.1 christos
939 1.1 christos #ifdef md_elf_section_change_hook
940 1.1 christos md_elf_section_change_hook ();
941 1.1 christos #endif
942 1.1 christos
943 1.1 christos return;
944 1.1 christos }
945 1.1 christos #endif /* ! defined (TC_I370) */
946 1.1 christos
947 1.1 christos name = obj_elf_section_name ();
948 1.1 christos if (name == NULL)
949 1.1 christos return;
950 1.1 christos type = SHT_NULL;
951 1.1 christos attr = 0;
952 1.1 christos group_name = NULL;
953 1.1 christos entsize = 0;
954 1.1 christos linkonce = 0;
955 1.1 christos
956 1.1 christos if (*input_line_pointer == ',')
957 1.1 christos {
958 1.1 christos /* Skip the comma. */
959 1.1 christos ++input_line_pointer;
960 1.1 christos SKIP_WHITESPACE ();
961 1.1 christos
962 1.1 christos if (push && ISDIGIT (*input_line_pointer))
963 1.1 christos {
964 1.1 christos /* .pushsection has an optional subsection. */
965 1.1 christos new_subsection = (subsegT) get_absolute_expression ();
966 1.1 christos
967 1.1 christos SKIP_WHITESPACE ();
968 1.1 christos
969 1.1 christos /* Stop if we don't see a comma. */
970 1.1 christos if (*input_line_pointer != ',')
971 1.1 christos goto done;
972 1.1 christos
973 1.1 christos /* Skip the comma. */
974 1.1 christos ++input_line_pointer;
975 1.1 christos SKIP_WHITESPACE ();
976 1.1 christos }
977 1.1 christos
978 1.1 christos if (*input_line_pointer == '"')
979 1.1 christos {
980 1.1 christos bfd_boolean is_clone;
981 1.1 christos
982 1.1 christos beg = demand_copy_C_string (&dummy);
983 1.1 christos if (beg == NULL)
984 1.1 christos {
985 1.1 christos ignore_rest_of_line ();
986 1.1 christos return;
987 1.1 christos }
988 1.1 christos attr |= obj_elf_parse_section_letters (beg, strlen (beg), &is_clone);
989 1.1 christos
990 1.1 christos SKIP_WHITESPACE ();
991 1.1 christos if (*input_line_pointer == ',')
992 1.1 christos {
993 1.1 christos char c;
994 1.1 christos char *save = input_line_pointer;
995 1.1 christos
996 1.1 christos ++input_line_pointer;
997 1.1 christos SKIP_WHITESPACE ();
998 1.1 christos c = *input_line_pointer;
999 1.1 christos if (c == '"')
1000 1.1 christos {
1001 1.1 christos beg = demand_copy_C_string (&dummy);
1002 1.1 christos if (beg == NULL)
1003 1.1 christos {
1004 1.1 christos ignore_rest_of_line ();
1005 1.1 christos return;
1006 1.1 christos }
1007 1.1 christos type = obj_elf_section_type (beg, strlen (beg), TRUE);
1008 1.1 christos }
1009 1.1 christos else if (c == '@' || c == '%')
1010 1.1 christos {
1011 1.1 christos beg = ++input_line_pointer;
1012 1.1 christos c = get_symbol_end ();
1013 1.1 christos *input_line_pointer = c;
1014 1.1 christos type = obj_elf_section_type (beg, input_line_pointer - beg, TRUE);
1015 1.1 christos }
1016 1.1 christos else
1017 1.1 christos input_line_pointer = save;
1018 1.1 christos }
1019 1.1 christos
1020 1.1 christos SKIP_WHITESPACE ();
1021 1.1 christos if ((attr & SHF_MERGE) != 0 && *input_line_pointer == ',')
1022 1.1 christos {
1023 1.1 christos ++input_line_pointer;
1024 1.1 christos SKIP_WHITESPACE ();
1025 1.1 christos entsize = get_absolute_expression ();
1026 1.1 christos SKIP_WHITESPACE ();
1027 1.1 christos if (entsize < 0)
1028 1.1 christos {
1029 1.1 christos as_warn (_("invalid merge entity size"));
1030 1.1 christos attr &= ~SHF_MERGE;
1031 1.1 christos entsize = 0;
1032 1.1 christos }
1033 1.1 christos }
1034 1.1 christos else if ((attr & SHF_MERGE) != 0)
1035 1.1 christos {
1036 1.1 christos as_warn (_("entity size for SHF_MERGE not specified"));
1037 1.1 christos attr &= ~SHF_MERGE;
1038 1.1 christos }
1039 1.1 christos
1040 1.1 christos if ((attr & SHF_GROUP) != 0 && is_clone)
1041 1.1 christos {
1042 1.1 christos as_warn (_("? section flag ignored with G present"));
1043 1.1 christos is_clone = FALSE;
1044 1.1 christos }
1045 1.1 christos if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',')
1046 1.1 christos {
1047 1.1 christos ++input_line_pointer;
1048 1.1 christos group_name = obj_elf_section_name ();
1049 1.1 christos if (group_name == NULL)
1050 1.1 christos attr &= ~SHF_GROUP;
1051 1.1 christos else if (*input_line_pointer == ',')
1052 1.1 christos {
1053 1.1 christos ++input_line_pointer;
1054 1.1 christos SKIP_WHITESPACE ();
1055 1.1 christos if (strncmp (input_line_pointer, "comdat", 6) == 0)
1056 1.1 christos {
1057 1.1 christos input_line_pointer += 6;
1058 1.1 christos linkonce = 1;
1059 1.1 christos }
1060 1.1 christos }
1061 1.1 christos else if (strncmp (name, ".gnu.linkonce", 13) == 0)
1062 1.1 christos linkonce = 1;
1063 1.1 christos }
1064 1.1 christos else if ((attr & SHF_GROUP) != 0)
1065 1.1 christos {
1066 1.1 christos as_warn (_("group name for SHF_GROUP not specified"));
1067 1.1 christos attr &= ~SHF_GROUP;
1068 1.1 christos }
1069 1.1 christos
1070 1.1 christos if (is_clone)
1071 1.1 christos {
1072 1.1 christos const char *now_group = elf_group_name (now_seg);
1073 1.1 christos if (now_group != NULL)
1074 1.1 christos {
1075 1.1 christos group_name = xstrdup (now_group);
1076 1.1 christos linkonce = (now_seg->flags & SEC_LINK_ONCE) != 0;
1077 1.1 christos }
1078 1.1 christos }
1079 1.1 christos }
1080 1.1 christos else
1081 1.1 christos {
1082 1.1 christos do
1083 1.1 christos {
1084 1.1 christos char c;
1085 1.1 christos
1086 1.1 christos SKIP_WHITESPACE ();
1087 1.1 christos if (*input_line_pointer != '#')
1088 1.1 christos {
1089 1.1 christos as_bad (_("character following name is not '#'"));
1090 1.1 christos ignore_rest_of_line ();
1091 1.1 christos return;
1092 1.1 christos }
1093 1.1 christos beg = ++input_line_pointer;
1094 1.1 christos c = get_symbol_end ();
1095 1.1 christos *input_line_pointer = c;
1096 1.1 christos
1097 1.1 christos attr |= obj_elf_section_word (beg, input_line_pointer - beg, & type);
1098 1.1 christos
1099 1.1 christos SKIP_WHITESPACE ();
1100 1.1 christos }
1101 1.1 christos while (*input_line_pointer++ == ',');
1102 1.1 christos --input_line_pointer;
1103 1.1 christos }
1104 1.1 christos }
1105 1.1 christos
1106 1.1 christos done:
1107 1.1 christos demand_empty_rest_of_line ();
1108 1.1 christos
1109 1.1 christos obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push);
1110 1.1 christos
1111 1.1 christos if (push && new_subsection != -1)
1112 1.1 christos subseg_set (now_seg, new_subsection);
1113 1.1 christos }
1114 1.1 christos
1115 1.1 christos /* Change to the .data section. */
1116 1.1 christos
1117 1.1 christos void
1118 1.1 christos obj_elf_data (int i)
1119 1.1 christos {
1120 1.1 christos #ifdef md_flush_pending_output
1121 1.1 christos md_flush_pending_output ();
1122 1.1 christos #endif
1123 1.1 christos
1124 1.1 christos previous_section = now_seg;
1125 1.1 christos previous_subsection = now_subseg;
1126 1.1 christos s_data (i);
1127 1.1 christos
1128 1.1 christos #ifdef md_elf_section_change_hook
1129 1.1 christos md_elf_section_change_hook ();
1130 1.1 christos #endif
1131 1.1 christos }
1132 1.1 christos
1133 1.1 christos /* Change to the .text section. */
1134 1.1 christos
1135 1.1 christos void
1136 1.1 christos obj_elf_text (int i)
1137 1.1 christos {
1138 1.1 christos #ifdef md_flush_pending_output
1139 1.1 christos md_flush_pending_output ();
1140 1.1 christos #endif
1141 1.1 christos
1142 1.1 christos previous_section = now_seg;
1143 1.1 christos previous_subsection = now_subseg;
1144 1.1 christos s_text (i);
1145 1.1 christos
1146 1.1 christos #ifdef md_elf_section_change_hook
1147 1.1 christos md_elf_section_change_hook ();
1148 1.1 christos #endif
1149 1.1 christos }
1150 1.1 christos
1151 1.1 christos /* Change to the *ABS* section. */
1152 1.1 christos
1153 1.1 christos void
1154 1.1 christos obj_elf_struct (int i)
1155 1.1 christos {
1156 1.1 christos #ifdef md_flush_pending_output
1157 1.1 christos md_flush_pending_output ();
1158 1.1 christos #endif
1159 1.1 christos
1160 1.1 christos previous_section = now_seg;
1161 1.1 christos previous_subsection = now_subseg;
1162 1.1 christos s_struct (i);
1163 1.1 christos
1164 1.1 christos #ifdef md_elf_section_change_hook
1165 1.1 christos md_elf_section_change_hook ();
1166 1.1 christos #endif
1167 1.1 christos }
1168 1.1 christos
1169 1.1 christos static void
1170 1.1 christos obj_elf_subsection (int ignore ATTRIBUTE_UNUSED)
1171 1.1 christos {
1172 1.1 christos int temp;
1173 1.1 christos
1174 1.1 christos #ifdef md_flush_pending_output
1175 1.1 christos md_flush_pending_output ();
1176 1.1 christos #endif
1177 1.1 christos
1178 1.1 christos previous_section = now_seg;
1179 1.1 christos previous_subsection = now_subseg;
1180 1.1 christos
1181 1.1 christos temp = get_absolute_expression ();
1182 1.1 christos subseg_set (now_seg, (subsegT) temp);
1183 1.1 christos demand_empty_rest_of_line ();
1184 1.1 christos
1185 1.1 christos #ifdef md_elf_section_change_hook
1186 1.1 christos md_elf_section_change_hook ();
1187 1.1 christos #endif
1188 1.1 christos }
1189 1.1 christos
1190 1.1 christos /* This can be called from the processor backends if they change
1191 1.1 christos sections. */
1192 1.1 christos
1193 1.1 christos void
1194 1.1 christos obj_elf_section_change_hook (void)
1195 1.1 christos {
1196 1.1 christos previous_section = now_seg;
1197 1.1 christos previous_subsection = now_subseg;
1198 1.1 christos }
1199 1.1 christos
1200 1.1 christos void
1201 1.1 christos obj_elf_previous (int ignore ATTRIBUTE_UNUSED)
1202 1.1 christos {
1203 1.1 christos segT new_section;
1204 1.1 christos int new_subsection;
1205 1.1 christos
1206 1.1 christos if (previous_section == 0)
1207 1.1 christos {
1208 1.1 christos as_warn (_(".previous without corresponding .section; ignored"));
1209 1.1 christos return;
1210 1.1 christos }
1211 1.1 christos
1212 1.1 christos #ifdef md_flush_pending_output
1213 1.1 christos md_flush_pending_output ();
1214 1.1 christos #endif
1215 1.1 christos
1216 1.1 christos new_section = previous_section;
1217 1.1 christos new_subsection = previous_subsection;
1218 1.1 christos previous_section = now_seg;
1219 1.1 christos previous_subsection = now_subseg;
1220 1.1 christos subseg_set (new_section, new_subsection);
1221 1.1 christos
1222 1.1 christos #ifdef md_elf_section_change_hook
1223 1.1 christos md_elf_section_change_hook ();
1224 1.1 christos #endif
1225 1.1 christos }
1226 1.1 christos
1227 1.1 christos static void
1228 1.1 christos obj_elf_popsection (int xxx ATTRIBUTE_UNUSED)
1229 1.1 christos {
1230 1.1 christos struct section_stack *top = section_stack;
1231 1.1 christos
1232 1.1 christos if (top == NULL)
1233 1.1 christos {
1234 1.1 christos as_warn (_(".popsection without corresponding .pushsection; ignored"));
1235 1.1 christos return;
1236 1.1 christos }
1237 1.1 christos
1238 1.1 christos #ifdef md_flush_pending_output
1239 1.1 christos md_flush_pending_output ();
1240 1.1 christos #endif
1241 1.1 christos
1242 1.1 christos section_stack = top->next;
1243 1.1 christos previous_section = top->prev_seg;
1244 1.1 christos previous_subsection = top->prev_subseg;
1245 1.1 christos subseg_set (top->seg, top->subseg);
1246 1.1 christos free (top);
1247 1.1 christos
1248 1.1 christos #ifdef md_elf_section_change_hook
1249 1.1 christos md_elf_section_change_hook ();
1250 1.1 christos #endif
1251 1.1 christos }
1252 1.1 christos
1253 1.1 christos static void
1254 1.1 christos obj_elf_line (int ignore ATTRIBUTE_UNUSED)
1255 1.1 christos {
1256 1.1 christos /* Assume delimiter is part of expression. BSD4.2 as fails with
1257 1.1 christos delightful bug, so we are not being incompatible here. */
1258 1.1 christos new_logical_line (NULL, get_absolute_expression ());
1259 1.1 christos demand_empty_rest_of_line ();
1260 1.1 christos }
1261 1.1 christos
1262 1.1 christos /* This handles the .symver pseudo-op, which is used to specify a
1263 1.1 christos symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1264 1.1 christos SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1265 1.1 christos pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1266 1.1 christos with the same value as the symbol NAME. */
1267 1.1 christos
1268 1.1 christos static void
1269 1.1 christos obj_elf_symver (int ignore ATTRIBUTE_UNUSED)
1270 1.1 christos {
1271 1.1 christos char *name;
1272 1.1 christos char c;
1273 1.1 christos char old_lexat;
1274 1.1 christos symbolS *sym;
1275 1.1 christos
1276 1.1 christos sym = get_sym_from_input_line_and_check ();
1277 1.1 christos
1278 1.1 christos if (*input_line_pointer != ',')
1279 1.1 christos {
1280 1.1 christos as_bad (_("expected comma after name in .symver"));
1281 1.1 christos ignore_rest_of_line ();
1282 1.1 christos return;
1283 1.1 christos }
1284 1.1 christos
1285 1.1 christos ++input_line_pointer;
1286 1.1 christos SKIP_WHITESPACE ();
1287 1.1 christos name = input_line_pointer;
1288 1.1 christos
1289 1.1 christos /* Temporarily include '@' in symbol names. */
1290 1.1 christos old_lexat = lex_type[(unsigned char) '@'];
1291 1.1 christos lex_type[(unsigned char) '@'] |= LEX_NAME;
1292 1.1 christos c = get_symbol_end ();
1293 1.1 christos lex_type[(unsigned char) '@'] = old_lexat;
1294 1.1 christos
1295 1.1 christos if (symbol_get_obj (sym)->versioned_name == NULL)
1296 1.1 christos {
1297 1.1 christos symbol_get_obj (sym)->versioned_name = xstrdup (name);
1298 1.1 christos
1299 1.1 christos *input_line_pointer = c;
1300 1.1 christos
1301 1.1 christos if (strchr (symbol_get_obj (sym)->versioned_name,
1302 1.1 christos ELF_VER_CHR) == NULL)
1303 1.1 christos {
1304 1.1 christos as_bad (_("missing version name in `%s' for symbol `%s'"),
1305 1.1 christos symbol_get_obj (sym)->versioned_name,
1306 1.1 christos S_GET_NAME (sym));
1307 1.1 christos ignore_rest_of_line ();
1308 1.1 christos return;
1309 1.1 christos }
1310 1.1 christos }
1311 1.1 christos else
1312 1.1 christos {
1313 1.1 christos if (strcmp (symbol_get_obj (sym)->versioned_name, name))
1314 1.1 christos {
1315 1.1 christos as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1316 1.1 christos name, symbol_get_obj (sym)->versioned_name,
1317 1.1 christos S_GET_NAME (sym));
1318 1.1 christos ignore_rest_of_line ();
1319 1.1 christos return;
1320 1.1 christos }
1321 1.1 christos
1322 1.1 christos *input_line_pointer = c;
1323 1.1 christos }
1324 1.1 christos
1325 1.1 christos demand_empty_rest_of_line ();
1326 1.1 christos }
1327 1.1 christos
1328 1.1 christos /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1329 1.1 christos to the linker the hierarchy in which a particular table resides. The
1330 1.1 christos syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1331 1.1 christos
1332 1.1 christos struct fix *
1333 1.1 christos obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
1334 1.1 christos {
1335 1.1 christos char *cname, *pname;
1336 1.1 christos symbolS *csym, *psym;
1337 1.1 christos char c, bad = 0;
1338 1.1 christos
1339 1.1 christos if (*input_line_pointer == '#')
1340 1.1 christos ++input_line_pointer;
1341 1.1 christos
1342 1.1 christos cname = input_line_pointer;
1343 1.1 christos c = get_symbol_end ();
1344 1.1 christos csym = symbol_find (cname);
1345 1.1 christos
1346 1.1 christos /* GCFIXME: should check that we don't have two .vtable_inherits for
1347 1.1 christos the same child symbol. Also, we can currently only do this if the
1348 1.1 christos child symbol is already exists and is placed in a fragment. */
1349 1.1 christos
1350 1.1 christos if (csym == NULL || symbol_get_frag (csym) == NULL)
1351 1.1 christos {
1352 1.1 christos as_bad (_("expected `%s' to have already been set for .vtable_inherit"),
1353 1.1 christos cname);
1354 1.1 christos bad = 1;
1355 1.1 christos }
1356 1.1 christos
1357 1.1 christos *input_line_pointer = c;
1358 1.1 christos
1359 1.1 christos SKIP_WHITESPACE ();
1360 1.1 christos if (*input_line_pointer != ',')
1361 1.1 christos {
1362 1.1 christos as_bad (_("expected comma after name in .vtable_inherit"));
1363 1.1 christos ignore_rest_of_line ();
1364 1.1 christos return NULL;
1365 1.1 christos }
1366 1.1 christos
1367 1.1 christos ++input_line_pointer;
1368 1.1 christos SKIP_WHITESPACE ();
1369 1.1 christos
1370 1.1 christos if (*input_line_pointer == '#')
1371 1.1 christos ++input_line_pointer;
1372 1.1 christos
1373 1.1 christos if (input_line_pointer[0] == '0'
1374 1.1 christos && (input_line_pointer[1] == '\0'
1375 1.1 christos || ISSPACE (input_line_pointer[1])))
1376 1.1 christos {
1377 1.1 christos psym = section_symbol (absolute_section);
1378 1.1 christos ++input_line_pointer;
1379 1.1 christos }
1380 1.1 christos else
1381 1.1 christos {
1382 1.1 christos pname = input_line_pointer;
1383 1.1 christos c = get_symbol_end ();
1384 1.1 christos psym = symbol_find_or_make (pname);
1385 1.1 christos *input_line_pointer = c;
1386 1.1 christos }
1387 1.1 christos
1388 1.1 christos demand_empty_rest_of_line ();
1389 1.1 christos
1390 1.1 christos if (bad)
1391 1.1 christos return NULL;
1392 1.1 christos
1393 1.1 christos gas_assert (symbol_get_value_expression (csym)->X_op == O_constant);
1394 1.1 christos return fix_new (symbol_get_frag (csym),
1395 1.1 christos symbol_get_value_expression (csym)->X_add_number,
1396 1.1 christos 0, psym, 0, 0, BFD_RELOC_VTABLE_INHERIT);
1397 1.1 christos }
1398 1.1 christos
1399 1.1 christos /* This handles the .vtable_entry pseudo-op, which is used to indicate
1400 1.1 christos to the linker that a vtable slot was used. The syntax is
1401 1.1 christos ".vtable_entry tablename, offset". */
1402 1.1 christos
1403 1.1 christos struct fix *
1404 1.1 christos obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED)
1405 1.1 christos {
1406 1.1 christos symbolS *sym;
1407 1.1 christos offsetT offset;
1408 1.1 christos
1409 1.1 christos if (*input_line_pointer == '#')
1410 1.1 christos ++input_line_pointer;
1411 1.1 christos
1412 1.1 christos sym = get_sym_from_input_line_and_check ();
1413 1.1 christos if (*input_line_pointer != ',')
1414 1.1 christos {
1415 1.1 christos as_bad (_("expected comma after name in .vtable_entry"));
1416 1.1 christos ignore_rest_of_line ();
1417 1.1 christos return NULL;
1418 1.1 christos }
1419 1.1 christos
1420 1.1 christos ++input_line_pointer;
1421 1.1 christos if (*input_line_pointer == '#')
1422 1.1 christos ++input_line_pointer;
1423 1.1 christos
1424 1.1 christos offset = get_absolute_expression ();
1425 1.1 christos
1426 1.1 christos demand_empty_rest_of_line ();
1427 1.1 christos
1428 1.1 christos return fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0,
1429 1.1 christos BFD_RELOC_VTABLE_ENTRY);
1430 1.1 christos }
1431 1.1 christos
1432 1.1 christos void
1433 1.1 christos elf_obj_read_begin_hook (void)
1434 1.1 christos {
1435 1.1 christos #ifdef NEED_ECOFF_DEBUG
1436 1.1 christos if (ECOFF_DEBUGGING)
1437 1.1 christos ecoff_read_begin_hook ();
1438 1.1 christos #endif
1439 1.1 christos }
1440 1.1 christos
1441 1.1 christos void
1442 1.1 christos elf_obj_symbol_new_hook (symbolS *symbolP)
1443 1.1 christos {
1444 1.1 christos struct elf_obj_sy *sy_obj;
1445 1.1 christos
1446 1.1 christos sy_obj = symbol_get_obj (symbolP);
1447 1.1 christos sy_obj->size = NULL;
1448 1.1 christos sy_obj->versioned_name = NULL;
1449 1.1 christos
1450 1.1 christos #ifdef NEED_ECOFF_DEBUG
1451 1.1 christos if (ECOFF_DEBUGGING)
1452 1.1 christos ecoff_symbol_new_hook (symbolP);
1453 1.1 christos #endif
1454 1.1 christos }
1455 1.1 christos
1456 1.1 christos /* When setting one symbol equal to another, by default we probably
1457 1.1 christos want them to have the same "size", whatever it means in the current
1458 1.1 christos context. */
1459 1.1 christos
1460 1.1 christos void
1461 1.1 christos elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
1462 1.1 christos {
1463 1.1 christos struct elf_obj_sy *srcelf = symbol_get_obj (src);
1464 1.1 christos struct elf_obj_sy *destelf = symbol_get_obj (dest);
1465 1.1 christos if (srcelf->size)
1466 1.1 christos {
1467 1.1 christos if (destelf->size == NULL)
1468 1.1 christos destelf->size = (expressionS *) xmalloc (sizeof (expressionS));
1469 1.1 christos *destelf->size = *srcelf->size;
1470 1.1 christos }
1471 1.1 christos else
1472 1.1 christos {
1473 1.1 christos if (destelf->size != NULL)
1474 1.1 christos free (destelf->size);
1475 1.1 christos destelf->size = NULL;
1476 1.1 christos }
1477 1.1 christos S_SET_SIZE (dest, S_GET_SIZE (src));
1478 1.1 christos /* Don't copy visibility. */
1479 1.1 christos S_SET_OTHER (dest, (ELF_ST_VISIBILITY (S_GET_OTHER (dest))
1480 1.1 christos | (S_GET_OTHER (src) & ~ELF_ST_VISIBILITY (-1))));
1481 1.1 christos }
1482 1.1 christos
1483 1.1 christos void
1484 1.1 christos obj_elf_version (int ignore ATTRIBUTE_UNUSED)
1485 1.1 christos {
1486 1.1 christos char *name;
1487 1.1 christos unsigned int c;
1488 1.1 christos char *p;
1489 1.1 christos asection *seg = now_seg;
1490 1.1 christos subsegT subseg = now_subseg;
1491 1.1 christos Elf_Internal_Note i_note;
1492 1.1 christos Elf_External_Note e_note;
1493 1.1 christos asection *note_secp = NULL;
1494 1.1 christos
1495 1.1 christos SKIP_WHITESPACE ();
1496 1.1 christos if (*input_line_pointer == '\"')
1497 1.1 christos {
1498 1.1 christos unsigned int len;
1499 1.1 christos
1500 1.1 christos ++input_line_pointer; /* -> 1st char of string. */
1501 1.1 christos name = input_line_pointer;
1502 1.1 christos
1503 1.1 christos while (is_a_char (c = next_char_of_string ()))
1504 1.1 christos ;
1505 1.1 christos c = *input_line_pointer;
1506 1.1 christos *input_line_pointer = '\0';
1507 1.1 christos *(input_line_pointer - 1) = '\0';
1508 1.1 christos *input_line_pointer = c;
1509 1.1 christos
1510 1.1 christos /* Create the .note section. */
1511 1.1 christos note_secp = subseg_new (".note", 0);
1512 1.1 christos bfd_set_section_flags (stdoutput,
1513 1.1 christos note_secp,
1514 1.1 christos SEC_HAS_CONTENTS | SEC_READONLY);
1515 1.1 christos
1516 1.1 christos /* Process the version string. */
1517 1.1 christos len = strlen (name) + 1;
1518 1.1 christos
1519 1.1 christos /* PR 3456: Although the name field is padded out to an 4-byte
1520 1.1 christos boundary, the namesz field should not be adjusted. */
1521 1.1 christos i_note.namesz = len;
1522 1.1 christos i_note.descsz = 0; /* No description. */
1523 1.1 christos i_note.type = NT_VERSION;
1524 1.1 christos p = frag_more (sizeof (e_note.namesz));
1525 1.1 christos md_number_to_chars (p, i_note.namesz, sizeof (e_note.namesz));
1526 1.1 christos p = frag_more (sizeof (e_note.descsz));
1527 1.1 christos md_number_to_chars (p, i_note.descsz, sizeof (e_note.descsz));
1528 1.1 christos p = frag_more (sizeof (e_note.type));
1529 1.1 christos md_number_to_chars (p, i_note.type, sizeof (e_note.type));
1530 1.1 christos p = frag_more (len);
1531 1.1 christos memcpy (p, name, len);
1532 1.1 christos
1533 1.1 christos frag_align (2, 0, 0);
1534 1.1 christos
1535 1.1 christos subseg_set (seg, subseg);
1536 1.1 christos }
1537 1.1 christos else
1538 1.1 christos as_bad (_("expected quoted string"));
1539 1.1 christos
1540 1.1 christos demand_empty_rest_of_line ();
1541 1.1 christos }
1542 1.1 christos
1543 1.1 christos static void
1544 1.1 christos obj_elf_size (int ignore ATTRIBUTE_UNUSED)
1545 1.1 christos {
1546 1.1 christos char *name = input_line_pointer;
1547 1.1 christos char c = get_symbol_end ();
1548 1.1 christos char *p;
1549 1.1 christos expressionS exp;
1550 1.1 christos symbolS *sym;
1551 1.1 christos
1552 1.1 christos p = input_line_pointer;
1553 1.1 christos *p = c;
1554 1.1 christos SKIP_WHITESPACE ();
1555 1.1 christos if (*input_line_pointer != ',')
1556 1.1 christos {
1557 1.1 christos *p = 0;
1558 1.1 christos as_bad (_("expected comma after name `%s' in .size directive"), name);
1559 1.1 christos *p = c;
1560 1.1 christos ignore_rest_of_line ();
1561 1.1 christos return;
1562 1.1 christos }
1563 1.1 christos input_line_pointer++;
1564 1.1 christos expression (&exp);
1565 1.1 christos if (exp.X_op == O_absent)
1566 1.1 christos {
1567 1.1 christos as_bad (_("missing expression in .size directive"));
1568 1.1 christos exp.X_op = O_constant;
1569 1.1 christos exp.X_add_number = 0;
1570 1.1 christos }
1571 1.1 christos *p = 0;
1572 1.1 christos sym = symbol_find_or_make (name);
1573 1.1 christos *p = c;
1574 1.1 christos if (exp.X_op == O_constant)
1575 1.1 christos {
1576 1.1 christos S_SET_SIZE (sym, exp.X_add_number);
1577 1.1 christos if (symbol_get_obj (sym)->size)
1578 1.1 christos {
1579 1.1 christos xfree (symbol_get_obj (sym)->size);
1580 1.1 christos symbol_get_obj (sym)->size = NULL;
1581 1.1 christos }
1582 1.1 christos }
1583 1.1 christos else
1584 1.1 christos {
1585 1.1 christos symbol_get_obj (sym)->size =
1586 1.1 christos (expressionS *) xmalloc (sizeof (expressionS));
1587 1.1 christos *symbol_get_obj (sym)->size = exp;
1588 1.1 christos }
1589 1.1 christos demand_empty_rest_of_line ();
1590 1.1 christos }
1591 1.1 christos
1592 1.1 christos /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
1593 1.1 christos There are six syntaxes:
1594 1.1 christos
1595 1.1 christos The first (used on Solaris) is
1596 1.1 christos .type SYM,#function
1597 1.1 christos The second (used on UnixWare) is
1598 1.1 christos .type SYM,@function
1599 1.1 christos The third (reportedly to be used on Irix 6.0) is
1600 1.1 christos .type SYM STT_FUNC
1601 1.1 christos The fourth (used on NetBSD/Arm and Linux/ARM) is
1602 1.1 christos .type SYM,%function
1603 1.1 christos The fifth (used on SVR4/860) is
1604 1.1 christos .type SYM,"function"
1605 1.1 christos The sixth (emitted by recent SunPRO under Solaris) is
1606 1.1 christos .type SYM,[0-9]
1607 1.1 christos where the integer is the STT_* value.
1608 1.1 christos */
1609 1.1 christos
1610 1.1 christos static char *
1611 1.1 christos obj_elf_type_name (char *cp)
1612 1.1 christos {
1613 1.1 christos char *p;
1614 1.1 christos
1615 1.1 christos p = input_line_pointer;
1616 1.1 christos if (*input_line_pointer >= '0'
1617 1.1 christos && *input_line_pointer <= '9')
1618 1.1 christos {
1619 1.1 christos while (*input_line_pointer >= '0'
1620 1.1 christos && *input_line_pointer <= '9')
1621 1.1 christos ++input_line_pointer;
1622 1.1 christos *cp = *input_line_pointer;
1623 1.1 christos *input_line_pointer = '\0';
1624 1.1 christos }
1625 1.1 christos else
1626 1.1 christos *cp = get_symbol_end ();
1627 1.1 christos
1628 1.1 christos return p;
1629 1.1 christos }
1630 1.1 christos
1631 1.1 christos static void
1632 1.1 christos obj_elf_type (int ignore ATTRIBUTE_UNUSED)
1633 1.1 christos {
1634 1.1 christos char c;
1635 1.1 christos int type;
1636 1.1 christos const char *type_name;
1637 1.1 christos symbolS *sym;
1638 1.1 christos elf_symbol_type *elfsym;
1639 1.1 christos
1640 1.1 christos sym = get_sym_from_input_line_and_check ();
1641 1.1 christos c = *input_line_pointer;
1642 1.1 christos elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym);
1643 1.1 christos
1644 1.1 christos if (*input_line_pointer == ',')
1645 1.1 christos ++input_line_pointer;
1646 1.1 christos
1647 1.1 christos SKIP_WHITESPACE ();
1648 1.1 christos if ( *input_line_pointer == '#'
1649 1.1 christos || *input_line_pointer == '@'
1650 1.1 christos || *input_line_pointer == '"'
1651 1.1 christos || *input_line_pointer == '%')
1652 1.1 christos ++input_line_pointer;
1653 1.1 christos
1654 1.1 christos type_name = obj_elf_type_name (& c);
1655 1.1 christos
1656 1.1 christos type = 0;
1657 1.1 christos if (strcmp (type_name, "function") == 0
1658 1.1 christos || strcmp (type_name, "2") == 0
1659 1.1 christos || strcmp (type_name, "STT_FUNC") == 0)
1660 1.1 christos type = BSF_FUNCTION;
1661 1.1 christos else if (strcmp (type_name, "object") == 0
1662 1.1 christos || strcmp (type_name, "1") == 0
1663 1.1 christos || strcmp (type_name, "STT_OBJECT") == 0)
1664 1.1 christos type = BSF_OBJECT;
1665 1.1 christos else if (strcmp (type_name, "tls_object") == 0
1666 1.1 christos || strcmp (type_name, "6") == 0
1667 1.1 christos || strcmp (type_name, "STT_TLS") == 0)
1668 1.1 christos type = BSF_OBJECT | BSF_THREAD_LOCAL;
1669 1.1 christos else if (strcmp (type_name, "notype") == 0
1670 1.1 christos || strcmp (type_name, "0") == 0
1671 1.1 christos || strcmp (type_name, "STT_NOTYPE") == 0)
1672 1.1 christos ;
1673 1.1 christos else if (strcmp (type_name, "common") == 0
1674 1.1 christos || strcmp (type_name, "5") == 0
1675 1.1 christos || strcmp (type_name, "STT_COMMON") == 0)
1676 1.1 christos {
1677 1.1 christos type = BSF_OBJECT;
1678 1.1 christos
1679 1.1 christos if (! S_IS_COMMON (sym))
1680 1.1 christos {
1681 1.1 christos if (S_IS_VOLATILE (sym))
1682 1.1 christos {
1683 1.1 christos sym = symbol_clone (sym, 1);
1684 1.1 christos S_SET_SEGMENT (sym, bfd_com_section_ptr);
1685 1.1 christos S_SET_VALUE (sym, 0);
1686 1.1 christos S_SET_EXTERNAL (sym);
1687 1.1 christos symbol_set_frag (sym, &zero_address_frag);
1688 1.1 christos S_CLEAR_VOLATILE (sym);
1689 1.1 christos }
1690 1.1 christos else if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
1691 1.1 christos as_bad (_("symbol '%s' is already defined"), S_GET_NAME (sym));
1692 1.1 christos else
1693 1.1 christos {
1694 1.1 christos /* FIXME: Is it safe to just change the section ? */
1695 1.1 christos S_SET_SEGMENT (sym, bfd_com_section_ptr);
1696 1.1 christos S_SET_VALUE (sym, 0);
1697 1.1 christos S_SET_EXTERNAL (sym);
1698 1.1 christos }
1699 1.1 christos }
1700 1.1 christos }
1701 1.1 christos else if (strcmp (type_name, "gnu_indirect_function") == 0
1702 1.1 christos || strcmp (type_name, "10") == 0
1703 1.1 christos || strcmp (type_name, "STT_GNU_IFUNC") == 0)
1704 1.1 christos {
1705 1.1 christos const struct elf_backend_data *bed;
1706 1.1 christos
1707 1.1 christos bed = get_elf_backend_data (stdoutput);
1708 1.1 christos #if 0
1709 1.1 christos if (!(bed->elf_osabi == ELFOSABI_GNU
1710 1.1 christos || bed->elf_osabi == ELFOSABI_FREEBSD
1711 1.1 christos /* GNU is still using the default value 0. */
1712 1.1 christos || bed->elf_osabi == ELFOSABI_NONE))
1713 1.1 christos as_bad (_("symbol type \"%s\" is supported only by GNU and FreeBSD targets"),
1714 1.1 christos type_name);
1715 1.1 christos #endif
1716 1.1 christos type = BSF_FUNCTION | BSF_GNU_INDIRECT_FUNCTION;
1717 1.1 christos }
1718 1.1 christos else if (strcmp (type_name, "gnu_unique_object") == 0)
1719 1.1 christos {
1720 1.1 christos struct elf_backend_data *bed;
1721 1.1 christos
1722 1.1 christos bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput);
1723 1.1 christos if (!(bed->elf_osabi == ELFOSABI_GNU
1724 1.1 christos /* GNU is still using the default value 0. */
1725 1.1 christos || bed->elf_osabi == ELFOSABI_NONE))
1726 1.1 christos as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
1727 1.1 christos type_name);
1728 1.1 christos type = BSF_OBJECT | BSF_GNU_UNIQUE;
1729 1.1 christos /* PR 10549: Always set OSABI field to GNU for objects containing unique symbols. */
1730 1.1 christos bed->elf_osabi = ELFOSABI_GNU;
1731 1.1 christos }
1732 1.1 christos #ifdef md_elf_symbol_type
1733 1.1 christos else if ((type = md_elf_symbol_type (type_name, sym, elfsym)) != -1)
1734 1.1 christos ;
1735 1.1 christos #endif
1736 1.1 christos else
1737 1.1 christos as_bad (_("unrecognized symbol type \"%s\""), type_name);
1738 1.1 christos
1739 1.1 christos *input_line_pointer = c;
1740 1.1 christos
1741 1.1 christos if (*input_line_pointer == '"')
1742 1.1 christos ++input_line_pointer;
1743 1.1 christos
1744 1.1 christos elfsym->symbol.flags |= type;
1745 1.1 christos
1746 1.1 christos demand_empty_rest_of_line ();
1747 1.1 christos }
1748 1.1 christos
1749 1.1 christos static void
1750 1.1 christos obj_elf_ident (int ignore ATTRIBUTE_UNUSED)
1751 1.1 christos {
1752 1.1 christos static segT comment_section;
1753 1.1 christos segT old_section = now_seg;
1754 1.1 christos int old_subsection = now_subseg;
1755 1.1 christos
1756 1.1 christos #ifdef md_flush_pending_output
1757 1.1 christos md_flush_pending_output ();
1758 1.1 christos #endif
1759 1.1 christos
1760 1.1 christos if (!comment_section)
1761 1.1 christos {
1762 1.1 christos char *p;
1763 1.1 christos comment_section = subseg_new (".comment", 0);
1764 1.1 christos bfd_set_section_flags (stdoutput, comment_section,
1765 1.1 christos SEC_READONLY | SEC_HAS_CONTENTS
1766 1.1 christos | SEC_MERGE | SEC_STRINGS);
1767 1.1 christos comment_section->entsize = 1;
1768 1.1 christos #ifdef md_elf_section_change_hook
1769 1.1 christos md_elf_section_change_hook ();
1770 1.1 christos #endif
1771 1.1 christos p = frag_more (1);
1772 1.1 christos *p = 0;
1773 1.1 christos }
1774 1.1 christos else
1775 1.1 christos subseg_set (comment_section, 0);
1776 1.1 christos stringer (8 + 1);
1777 1.1 christos subseg_set (old_section, old_subsection);
1778 1.1 christos }
1779 1.1 christos
1780 1.1 christos #ifdef INIT_STAB_SECTION
1781 1.1 christos
1782 1.1 christos /* The first entry in a .stabs section is special. */
1783 1.1 christos
1784 1.1 christos void
1785 1.1 christos obj_elf_init_stab_section (segT seg)
1786 1.1 christos {
1787 1.1 christos char *file;
1788 1.1 christos char *p;
1789 1.1 christos char *stabstr_name;
1790 1.1 christos unsigned int stroff;
1791 1.1 christos
1792 1.1 christos /* Force the section to align to a longword boundary. Without this,
1793 1.1 christos UnixWare ar crashes. */
1794 1.1 christos bfd_set_section_alignment (stdoutput, seg, 2);
1795 1.1 christos
1796 1.1 christos /* Make space for this first symbol. */
1797 1.1 christos p = frag_more (12);
1798 1.1 christos /* Zero it out. */
1799 1.1 christos memset (p, 0, 12);
1800 1.1 christos as_where (&file, NULL);
1801 1.1 christos stabstr_name = (char *) xmalloc (strlen (segment_name (seg)) + 4);
1802 1.1 christos strcpy (stabstr_name, segment_name (seg));
1803 1.1 christos strcat (stabstr_name, "str");
1804 1.1 christos stroff = get_stab_string_offset (file, stabstr_name);
1805 1.1 christos know (stroff == 1 || (stroff == 0 && file[0] == '\0'));
1806 1.1 christos md_number_to_chars (p, stroff, 4);
1807 1.1 christos seg_info (seg)->stabu.p = p;
1808 1.1 christos }
1809 1.1 christos
1810 1.1 christos #endif
1811 1.1 christos
1812 1.1 christos /* Fill in the counts in the first entry in a .stabs section. */
1813 1.1 christos
1814 1.1 christos static void
1815 1.1 christos adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
1816 1.1 christos {
1817 1.1 christos char *name;
1818 1.1 christos asection *strsec;
1819 1.1 christos char *p;
1820 1.1 christos int strsz, nsyms;
1821 1.1 christos
1822 1.1 christos if (strncmp (".stab", sec->name, 5))
1823 1.1 christos return;
1824 1.1 christos if (!strcmp ("str", sec->name + strlen (sec->name) - 3))
1825 1.1 christos return;
1826 1.1 christos
1827 1.1 christos name = (char *) alloca (strlen (sec->name) + 4);
1828 1.1 christos strcpy (name, sec->name);
1829 1.1 christos strcat (name, "str");
1830 1.1 christos strsec = bfd_get_section_by_name (abfd, name);
1831 1.1 christos if (strsec)
1832 1.1 christos strsz = bfd_section_size (abfd, strsec);
1833 1.1 christos else
1834 1.1 christos strsz = 0;
1835 1.1 christos nsyms = bfd_section_size (abfd, sec) / 12 - 1;
1836 1.1 christos
1837 1.1 christos p = seg_info (sec)->stabu.p;
1838 1.1 christos gas_assert (p != 0);
1839 1.1 christos
1840 1.1 christos bfd_h_put_16 (abfd, nsyms, p + 6);
1841 1.1 christos bfd_h_put_32 (abfd, strsz, p + 8);
1842 1.1 christos }
1843 1.1 christos
1844 1.1 christos #ifdef NEED_ECOFF_DEBUG
1845 1.1 christos
1846 1.1 christos /* This function is called by the ECOFF code. It is supposed to
1847 1.1 christos record the external symbol information so that the backend can
1848 1.1 christos write it out correctly. The ELF backend doesn't actually handle
1849 1.1 christos this at the moment, so we do it ourselves. We save the information
1850 1.1 christos in the symbol. */
1851 1.1 christos
1852 1.1 christos #ifdef OBJ_MAYBE_ELF
1853 1.1 christos static
1854 1.1 christos #endif
1855 1.1 christos void
1856 1.1 christos elf_ecoff_set_ext (symbolS *sym, struct ecoff_extr *ext)
1857 1.1 christos {
1858 1.1 christos symbol_get_bfdsym (sym)->udata.p = ext;
1859 1.1 christos }
1860 1.1 christos
1861 1.1 christos /* This function is called by bfd_ecoff_debug_externals. It is
1862 1.1 christos supposed to *EXT to the external symbol information, and return
1863 1.1 christos whether the symbol should be used at all. */
1864 1.1 christos
1865 1.1 christos static bfd_boolean
1866 1.1 christos elf_get_extr (asymbol *sym, EXTR *ext)
1867 1.1 christos {
1868 1.1 christos if (sym->udata.p == NULL)
1869 1.1 christos return FALSE;
1870 1.1 christos *ext = *(EXTR *) sym->udata.p;
1871 1.1 christos return TRUE;
1872 1.1 christos }
1873 1.1 christos
1874 1.1 christos /* This function is called by bfd_ecoff_debug_externals. It has
1875 1.1 christos nothing to do for ELF. */
1876 1.1 christos
1877 1.1 christos static void
1878 1.1 christos elf_set_index (asymbol *sym ATTRIBUTE_UNUSED,
1879 1.1 christos bfd_size_type indx ATTRIBUTE_UNUSED)
1880 1.1 christos {
1881 1.1 christos }
1882 1.1 christos
1883 1.1 christos #endif /* NEED_ECOFF_DEBUG */
1884 1.1 christos
1885 1.1 christos void
1886 1.1 christos elf_frob_symbol (symbolS *symp, int *puntp)
1887 1.1 christos {
1888 1.1 christos struct elf_obj_sy *sy_obj;
1889 1.1 christos expressionS *size;
1890 1.1 christos
1891 1.1 christos #ifdef NEED_ECOFF_DEBUG
1892 1.1 christos if (ECOFF_DEBUGGING)
1893 1.1 christos ecoff_frob_symbol (symp);
1894 1.1 christos #endif
1895 1.1 christos
1896 1.1 christos sy_obj = symbol_get_obj (symp);
1897 1.1 christos
1898 1.1 christos size = sy_obj->size;
1899 1.1 christos if (size != NULL)
1900 1.1 christos {
1901 1.1 christos if (resolve_expression (size)
1902 1.1 christos && size->X_op == O_constant)
1903 1.1 christos S_SET_SIZE (symp, size->X_add_number);
1904 1.1 christos else
1905 1.1 christos {
1906 1.1 christos if (flag_size_check == size_check_error)
1907 1.1 christos as_bad (_(".size expression for %s "
1908 1.1 christos "does not evaluate to a constant"), S_GET_NAME (symp));
1909 1.1 christos else
1910 1.1 christos as_warn (_(".size expression for %s "
1911 1.1 christos "does not evaluate to a constant"), S_GET_NAME (symp));
1912 1.1 christos }
1913 1.1 christos free (sy_obj->size);
1914 1.1 christos sy_obj->size = NULL;
1915 1.1 christos }
1916 1.1 christos
1917 1.1 christos if (sy_obj->versioned_name != NULL)
1918 1.1 christos {
1919 1.1 christos char *p;
1920 1.1 christos
1921 1.1 christos p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
1922 1.1 christos know (p != NULL);
1923 1.1 christos
1924 1.1 christos /* This symbol was given a new name with the .symver directive.
1925 1.1 christos
1926 1.1 christos If this is an external reference, just rename the symbol to
1927 1.1 christos include the version string. This will make the relocs be
1928 1.1 christos against the correct versioned symbol.
1929 1.1 christos
1930 1.1 christos If this is a definition, add an alias. FIXME: Using an alias
1931 1.1 christos will permit the debugging information to refer to the right
1932 1.1 christos symbol. However, it's not clear whether it is the best
1933 1.1 christos approach. */
1934 1.1 christos
1935 1.1 christos if (! S_IS_DEFINED (symp))
1936 1.1 christos {
1937 1.1 christos /* Verify that the name isn't using the @@ syntax--this is
1938 1.1 christos reserved for definitions of the default version to link
1939 1.1 christos against. */
1940 1.1 christos if (p[1] == ELF_VER_CHR)
1941 1.1 christos {
1942 1.1 christos as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"),
1943 1.1 christos sy_obj->versioned_name);
1944 1.1 christos *puntp = TRUE;
1945 1.1 christos }
1946 1.1 christos S_SET_NAME (symp, sy_obj->versioned_name);
1947 1.1 christos }
1948 1.1 christos else
1949 1.1 christos {
1950 1.1 christos if (p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
1951 1.1 christos {
1952 1.1 christos size_t l;
1953 1.1 christos
1954 1.1 christos /* The @@@ syntax is a special case. It renames the
1955 1.1 christos symbol name to versioned_name with one `@' removed. */
1956 1.1 christos l = strlen (&p[3]) + 1;
1957 1.1 christos memmove (&p[2], &p[3], l);
1958 1.1 christos S_SET_NAME (symp, sy_obj->versioned_name);
1959 1.1 christos }
1960 1.1 christos else
1961 1.1 christos {
1962 1.1 christos symbolS *symp2;
1963 1.1 christos
1964 1.1 christos /* FIXME: Creating a new symbol here is risky. We're
1965 1.1 christos in the final loop over the symbol table. We can
1966 1.1 christos get away with it only because the symbol goes to
1967 1.1 christos the end of the list, where the loop will still see
1968 1.1 christos it. It would probably be better to do this in
1969 1.1 christos obj_frob_file_before_adjust. */
1970 1.1 christos
1971 1.1 christos symp2 = symbol_find_or_make (sy_obj->versioned_name);
1972 1.1 christos
1973 1.1 christos /* Now we act as though we saw symp2 = sym. */
1974 1.1 christos
1975 1.1 christos S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));
1976 1.1 christos
1977 1.1 christos /* Subtracting out the frag address here is a hack
1978 1.1 christos because we are in the middle of the final loop. */
1979 1.1 christos S_SET_VALUE (symp2,
1980 1.1 christos (S_GET_VALUE (symp)
1981 1.1 christos - symbol_get_frag (symp)->fr_address));
1982 1.1 christos
1983 1.1 christos symbol_set_frag (symp2, symbol_get_frag (symp));
1984 1.1 christos
1985 1.1 christos /* This will copy over the size information. */
1986 1.1 christos copy_symbol_attributes (symp2, symp);
1987 1.1 christos
1988 1.1 christos S_SET_OTHER (symp2, S_GET_OTHER (symp));
1989 1.1 christos
1990 1.1 christos if (S_IS_WEAK (symp))
1991 1.1 christos S_SET_WEAK (symp2);
1992 1.1 christos
1993 1.1 christos if (S_IS_EXTERNAL (symp))
1994 1.1 christos S_SET_EXTERNAL (symp2);
1995 1.1 christos }
1996 1.1 christos }
1997 1.1 christos }
1998 1.1 christos
1999 1.1 christos /* Double check weak symbols. */
2000 1.1 christos if (S_IS_WEAK (symp))
2001 1.1 christos {
2002 1.1 christos if (S_IS_COMMON (symp))
2003 1.1 christos as_bad (_("symbol `%s' can not be both weak and common"),
2004 1.1 christos S_GET_NAME (symp));
2005 1.1 christos }
2006 1.1 christos
2007 1.1 christos #ifdef TC_MIPS
2008 1.1 christos /* The Irix 5 and 6 assemblers set the type of any common symbol and
2009 1.1 christos any undefined non-function symbol to STT_OBJECT. We try to be
2010 1.1 christos compatible, since newer Irix 5 and 6 linkers care. However, we
2011 1.1 christos only set undefined symbols to be STT_OBJECT if we are on Irix,
2012 1.1 christos because that is the only time gcc will generate the necessary
2013 1.1 christos .global directives to mark functions. */
2014 1.1 christos
2015 1.1 christos if (S_IS_COMMON (symp))
2016 1.1 christos symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2017 1.1 christos
2018 1.1 christos if (strstr (TARGET_OS, "irix") != NULL
2019 1.1 christos && ! S_IS_DEFINED (symp)
2020 1.1 christos && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0)
2021 1.1 christos symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2022 1.1 christos #endif
2023 1.1 christos }
2024 1.1 christos
2025 1.1 christos struct group_list
2026 1.1 christos {
2027 1.1 christos asection **head; /* Section lists. */
2028 1.1 christos unsigned int *elt_count; /* Number of sections in each list. */
2029 1.1 christos unsigned int num_group; /* Number of lists. */
2030 1.1 christos struct hash_control *indexes; /* Maps group name to index in head array. */
2031 1.1 christos };
2032 1.1 christos
2033 1.1 christos /* Called via bfd_map_over_sections. If SEC is a member of a group,
2034 1.1 christos add it to a list of sections belonging to the group. INF is a
2035 1.1 christos pointer to a struct group_list, which is where we store the head of
2036 1.1 christos each list. */
2037 1.1 christos
2038 1.1 christos static void
2039 1.1 christos build_group_lists (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
2040 1.1 christos {
2041 1.1 christos struct group_list *list = (struct group_list *) inf;
2042 1.1 christos const char *group_name = elf_group_name (sec);
2043 1.1 christos unsigned int i;
2044 1.1 christos unsigned int *elem_idx;
2045 1.1 christos unsigned int *idx_ptr;
2046 1.1 christos
2047 1.1 christos if (group_name == NULL)
2048 1.1 christos return;
2049 1.1 christos
2050 1.1 christos /* If this group already has a list, add the section to the head of
2051 1.1 christos the list. */
2052 1.1 christos elem_idx = (unsigned int *) hash_find (list->indexes, group_name);
2053 1.1 christos if (elem_idx != NULL)
2054 1.1 christos {
2055 1.1 christos elf_next_in_group (sec) = list->head[*elem_idx];
2056 1.1 christos list->head[*elem_idx] = sec;
2057 1.1 christos list->elt_count[*elem_idx] += 1;
2058 1.1 christos return;
2059 1.1 christos }
2060 1.1 christos
2061 1.1 christos /* New group. Make the arrays bigger in chunks to minimize calls to
2062 1.1 christos realloc. */
2063 1.1 christos i = list->num_group;
2064 1.1 christos if ((i & 127) == 0)
2065 1.1 christos {
2066 1.1 christos unsigned int newsize = i + 128;
2067 1.1 christos list->head = (asection **) xrealloc (list->head,
2068 1.1 christos newsize * sizeof (*list->head));
2069 1.1 christos list->elt_count = (unsigned int *)
2070 1.1 christos xrealloc (list->elt_count, newsize * sizeof (*list->elt_count));
2071 1.1 christos }
2072 1.1 christos list->head[i] = sec;
2073 1.1 christos list->elt_count[i] = 1;
2074 1.1 christos list->num_group += 1;
2075 1.1 christos
2076 1.1 christos /* Add index to hash. */
2077 1.1 christos idx_ptr = (unsigned int *) xmalloc (sizeof (unsigned int));
2078 1.1 christos *idx_ptr = i;
2079 1.1 christos hash_insert (list->indexes, group_name, idx_ptr);
2080 1.1 christos }
2081 1.1 christos
2082 1.1 christos static void free_section_idx (const char *key ATTRIBUTE_UNUSED, void *val)
2083 1.1 christos {
2084 1.1 christos free ((unsigned int *) val);
2085 1.1 christos }
2086 1.1 christos
2087 1.1 christos void
2088 1.1 christos elf_adjust_symtab (void)
2089 1.1 christos {
2090 1.1 christos struct group_list list;
2091 1.1 christos unsigned int i;
2092 1.1 christos
2093 1.1 christos /* Go find section groups. */
2094 1.1 christos list.num_group = 0;
2095 1.1 christos list.head = NULL;
2096 1.1 christos list.elt_count = NULL;
2097 1.1 christos list.indexes = hash_new ();
2098 1.1 christos bfd_map_over_sections (stdoutput, build_group_lists, &list);
2099 1.1 christos
2100 1.1 christos /* Make the SHT_GROUP sections that describe each section group. We
2101 1.1 christos can't set up the section contents here yet, because elf section
2102 1.1 christos indices have yet to be calculated. elf.c:set_group_contents does
2103 1.1 christos the rest of the work. */
2104 1.1 christos for (i = 0; i < list.num_group; i++)
2105 1.1 christos {
2106 1.1 christos const char *group_name = elf_group_name (list.head[i]);
2107 1.1 christos const char *sec_name;
2108 1.1 christos asection *s;
2109 1.1 christos flagword flags;
2110 1.1 christos struct symbol *sy;
2111 1.1 christos bfd_size_type size;
2112 1.1 christos
2113 1.1 christos flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
2114 1.1 christos for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
2115 1.1 christos if ((s->flags ^ flags) & SEC_LINK_ONCE)
2116 1.1 christos {
2117 1.1 christos flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2118 1.1 christos if (s != list.head[i])
2119 1.1 christos {
2120 1.1 christos as_warn (_("assuming all members of group `%s' are COMDAT"),
2121 1.1 christos group_name);
2122 1.1 christos break;
2123 1.1 christos }
2124 1.1 christos }
2125 1.1 christos
2126 1.1 christos sec_name = ".group";
2127 1.1 christos s = subseg_force_new (sec_name, 0);
2128 1.1 christos if (s == NULL
2129 1.1 christos || !bfd_set_section_flags (stdoutput, s, flags)
2130 1.1 christos || !bfd_set_section_alignment (stdoutput, s, 2))
2131 1.1 christos {
2132 1.1 christos as_fatal (_("can't create group: %s"),
2133 1.1 christos bfd_errmsg (bfd_get_error ()));
2134 1.1 christos }
2135 1.1 christos elf_section_type (s) = SHT_GROUP;
2136 1.1 christos
2137 1.1 christos /* Pass a pointer to the first section in this group. */
2138 1.1 christos elf_next_in_group (s) = list.head[i];
2139 1.1 christos /* Make sure that the signature symbol for the group has the
2140 1.1 christos name of the group. */
2141 1.1 christos sy = symbol_find_exact (group_name);
2142 1.1 christos if (!sy
2143 1.1 christos || (sy != symbol_lastP
2144 1.1 christos && (sy->sy_next == NULL
2145 1.1 christos || sy->sy_next->sy_previous != sy)))
2146 1.1 christos {
2147 1.1 christos /* Create the symbol now. */
2148 1.1 christos sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now);
2149 1.1 christos #ifdef TE_SOLARIS
2150 1.1 christos /* Before Solaris 11 build 154, Sun ld rejects local group
2151 1.1 christos signature symbols, so make them weak hidden instead. */
2152 1.1 christos symbol_get_bfdsym (sy)->flags |= BSF_WEAK;
2153 1.1 christos S_SET_OTHER (sy, STV_HIDDEN);
2154 1.1 christos #else
2155 1.1 christos symbol_get_obj (sy)->local = 1;
2156 1.1 christos #endif
2157 1.1 christos symbol_table_insert (sy);
2158 1.1 christos }
2159 1.1 christos elf_group_id (s) = symbol_get_bfdsym (sy);
2160 1.1 christos
2161 1.1 christos size = 4 * (list.elt_count[i] + 1);
2162 1.1 christos bfd_set_section_size (stdoutput, s, size);
2163 1.1 christos s->contents = (unsigned char *) frag_more (size);
2164 1.1 christos frag_now->fr_fix = frag_now_fix_octets ();
2165 1.1 christos frag_wane (frag_now);
2166 1.1 christos }
2167 1.1 christos
2168 1.1 christos /* Cleanup hash. */
2169 1.1 christos hash_traverse (list.indexes, free_section_idx);
2170 1.1 christos hash_die (list.indexes);
2171 1.1 christos }
2172 1.1 christos
2173 1.1 christos void
2174 1.1 christos elf_frob_file (void)
2175 1.1 christos {
2176 1.1 christos bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL);
2177 1.1 christos
2178 1.1 christos #ifdef elf_tc_final_processing
2179 1.1 christos elf_tc_final_processing ();
2180 1.1 christos #endif
2181 1.1 christos }
2182 1.1 christos
2183 1.1 christos /* It removes any unneeded versioned symbols from the symbol table. */
2184 1.1 christos
2185 1.1 christos void
2186 1.1 christos elf_frob_file_before_adjust (void)
2187 1.1 christos {
2188 1.1 christos if (symbol_rootP)
2189 1.1 christos {
2190 1.1 christos symbolS *symp;
2191 1.1 christos
2192 1.1 christos for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2193 1.1 christos if (!S_IS_DEFINED (symp))
2194 1.1 christos {
2195 1.1 christos if (symbol_get_obj (symp)->versioned_name)
2196 1.1 christos {
2197 1.1 christos char *p;
2198 1.1 christos
2199 1.1 christos /* The @@@ syntax is a special case. If the symbol is
2200 1.1 christos not defined, 2 `@'s will be removed from the
2201 1.1 christos versioned_name. */
2202 1.1 christos
2203 1.1 christos p = strchr (symbol_get_obj (symp)->versioned_name,
2204 1.1 christos ELF_VER_CHR);
2205 1.1 christos know (p != NULL);
2206 1.1 christos if (p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
2207 1.1 christos {
2208 1.1 christos size_t l = strlen (&p[3]) + 1;
2209 1.1 christos memmove (&p[1], &p[3], l);
2210 1.1 christos }
2211 1.1 christos if (symbol_used_p (symp) == 0
2212 1.1 christos && symbol_used_in_reloc_p (symp) == 0)
2213 1.1 christos symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2214 1.1 christos }
2215 1.1 christos
2216 1.1 christos /* If there was .weak foo, but foo was neither defined nor
2217 1.1 christos used anywhere, remove it. */
2218 1.1 christos
2219 1.1 christos else if (S_IS_WEAK (symp)
2220 1.1 christos && symbol_used_p (symp) == 0
2221 1.1 christos && symbol_used_in_reloc_p (symp) == 0)
2222 1.1 christos symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2223 1.1 christos }
2224 1.1 christos }
2225 1.1 christos }
2226 1.1 christos
2227 1.1 christos /* It is required that we let write_relocs have the opportunity to
2228 1.1 christos optimize away fixups before output has begun, since it is possible
2229 1.1 christos to eliminate all fixups for a section and thus we never should
2230 1.1 christos have generated the relocation section. */
2231 1.1 christos
2232 1.1 christos void
2233 1.1 christos elf_frob_file_after_relocs (void)
2234 1.1 christos {
2235 1.1 christos #ifdef NEED_ECOFF_DEBUG
2236 1.1 christos if (ECOFF_DEBUGGING)
2237 1.1 christos /* Generate the ECOFF debugging information. */
2238 1.1 christos {
2239 1.1 christos const struct ecoff_debug_swap *debug_swap;
2240 1.1 christos struct ecoff_debug_info debug;
2241 1.1 christos char *buf;
2242 1.1 christos asection *sec;
2243 1.1 christos
2244 1.1 christos debug_swap
2245 1.1 christos = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap;
2246 1.1 christos know (debug_swap != NULL);
2247 1.1 christos ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap);
2248 1.1 christos
2249 1.1 christos /* Set up the pointers in debug. */
2250 1.1 christos #define SET(ptr, offset, type) \
2251 1.1 christos debug.ptr = (type) (buf + debug.symbolic_header.offset)
2252 1.1 christos
2253 1.1 christos SET (line, cbLineOffset, unsigned char *);
2254 1.1 christos SET (external_dnr, cbDnOffset, void *);
2255 1.1 christos SET (external_pdr, cbPdOffset, void *);
2256 1.1 christos SET (external_sym, cbSymOffset, void *);
2257 1.1 christos SET (external_opt, cbOptOffset, void *);
2258 1.1 christos SET (external_aux, cbAuxOffset, union aux_ext *);
2259 1.1 christos SET (ss, cbSsOffset, char *);
2260 1.1 christos SET (external_fdr, cbFdOffset, void *);
2261 1.1 christos SET (external_rfd, cbRfdOffset, void *);
2262 1.1 christos /* ssext and external_ext are set up just below. */
2263 1.1 christos
2264 1.1 christos #undef SET
2265 1.1 christos
2266 1.1 christos /* Set up the external symbols. */
2267 1.1 christos debug.ssext = debug.ssext_end = NULL;
2268 1.1 christos debug.external_ext = debug.external_ext_end = NULL;
2269 1.1 christos if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE,
2270 1.1 christos elf_get_extr, elf_set_index))
2271 1.1 christos as_fatal (_("failed to set up debugging information: %s"),
2272 1.1 christos bfd_errmsg (bfd_get_error ()));
2273 1.1 christos
2274 1.1 christos sec = bfd_get_section_by_name (stdoutput, ".mdebug");
2275 1.1 christos gas_assert (sec != NULL);
2276 1.1 christos
2277 1.1 christos know (!stdoutput->output_has_begun);
2278 1.1 christos
2279 1.1 christos /* We set the size of the section, call bfd_set_section_contents
2280 1.1 christos to force the ELF backend to allocate a file position, and then
2281 1.1 christos write out the data. FIXME: Is this really the best way to do
2282 1.1 christos this? */
2283 1.1 christos bfd_set_section_size
2284 1.1 christos (stdoutput, sec, bfd_ecoff_debug_size (stdoutput, &debug, debug_swap));
2285 1.1 christos
2286 1.1 christos /* Pass BUF to bfd_set_section_contents because this will
2287 1.1 christos eventually become a call to fwrite, and ISO C prohibits
2288 1.1 christos passing a NULL pointer to a stdio function even if the
2289 1.1 christos pointer will not be used. */
2290 1.1 christos if (! bfd_set_section_contents (stdoutput, sec, buf, 0, 0))
2291 1.1 christos as_fatal (_("can't start writing .mdebug section: %s"),
2292 1.1 christos bfd_errmsg (bfd_get_error ()));
2293 1.1 christos
2294 1.1 christos know (stdoutput->output_has_begun);
2295 1.1 christos know (sec->filepos != 0);
2296 1.1 christos
2297 1.1 christos if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap,
2298 1.1 christos sec->filepos))
2299 1.1 christos as_fatal (_("could not write .mdebug section: %s"),
2300 1.1 christos bfd_errmsg (bfd_get_error ()));
2301 1.1 christos }
2302 1.1 christos #endif /* NEED_ECOFF_DEBUG */
2303 1.1 christos }
2304 1.1 christos
2305 1.1 christos #ifdef SCO_ELF
2306 1.1 christos
2307 1.1 christos /* Heavily plagiarized from obj_elf_version. The idea is to emit the
2308 1.1 christos SCO specific identifier in the .notes section to satisfy the SCO
2309 1.1 christos linker.
2310 1.1 christos
2311 1.1 christos This looks more complicated than it really is. As opposed to the
2312 1.1 christos "obvious" solution, this should handle the cross dev cases
2313 1.1 christos correctly. (i.e, hosting on a 64 bit big endian processor, but
2314 1.1 christos generating SCO Elf code) Efficiency isn't a concern, as there
2315 1.1 christos should be exactly one of these sections per object module.
2316 1.1 christos
2317 1.1 christos SCO OpenServer 5 identifies it's ELF modules with a standard ELF
2318 1.1 christos .note section.
2319 1.1 christos
2320 1.1 christos int_32 namesz = 4 ; Name size
2321 1.1 christos int_32 descsz = 12 ; Descriptive information
2322 1.1 christos int_32 type = 1 ;
2323 1.1 christos char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL
2324 1.1 christos int_32 version = (major ver # << 16) | version of tools ;
2325 1.1 christos int_32 source = (tool_id << 16 ) | 1 ;
2326 1.1 christos int_32 info = 0 ; These are set by the SCO tools, but we
2327 1.1 christos don't know enough about the source
2328 1.1 christos environment to set them. SCO ld currently
2329 1.1 christos ignores them, and recommends we set them
2330 1.1 christos to zero. */
2331 1.1 christos
2332 1.1 christos #define SCO_MAJOR_VERSION 0x1
2333 1.1 christos #define SCO_MINOR_VERSION 0x1
2334 1.1 christos
2335 1.1 christos void
2336 1.1 christos sco_id (void)
2337 1.1 christos {
2338 1.1 christos
2339 1.1 christos char *name;
2340 1.1 christos unsigned int c;
2341 1.1 christos char ch;
2342 1.1 christos char *p;
2343 1.1 christos asection *seg = now_seg;
2344 1.1 christos subsegT subseg = now_subseg;
2345 1.1 christos Elf_Internal_Note i_note;
2346 1.1 christos Elf_External_Note e_note;
2347 1.1 christos asection *note_secp = NULL;
2348 1.1 christos int i, len;
2349 1.1 christos
2350 1.1 christos /* create the .note section */
2351 1.1 christos
2352 1.1 christos note_secp = subseg_new (".note", 0);
2353 1.1 christos bfd_set_section_flags (stdoutput,
2354 1.1 christos note_secp,
2355 1.1 christos SEC_HAS_CONTENTS | SEC_READONLY);
2356 1.1 christos
2357 1.1 christos /* process the version string */
2358 1.1 christos
2359 1.1 christos i_note.namesz = 4;
2360 1.1 christos i_note.descsz = 12; /* 12 descriptive bytes */
2361 1.1 christos i_note.type = NT_VERSION; /* Contains a version string */
2362 1.1 christos
2363 1.1 christos p = frag_more (sizeof (i_note.namesz));
2364 1.1 christos md_number_to_chars (p, i_note.namesz, 4);
2365 1.1 christos
2366 1.1 christos p = frag_more (sizeof (i_note.descsz));
2367 1.1 christos md_number_to_chars (p, i_note.descsz, 4);
2368 1.1 christos
2369 1.1 christos p = frag_more (sizeof (i_note.type));
2370 1.1 christos md_number_to_chars (p, i_note.type, 4);
2371 1.1 christos
2372 1.1 christos p = frag_more (4);
2373 1.1 christos strcpy (p, "SCO");
2374 1.1 christos
2375 1.1 christos /* Note: this is the version number of the ELF we're representing */
2376 1.1 christos p = frag_more (4);
2377 1.1 christos md_number_to_chars (p, (SCO_MAJOR_VERSION << 16) | (SCO_MINOR_VERSION), 4);
2378 1.1 christos
2379 1.1 christos /* Here, we pick a magic number for ourselves (yes, I "registered"
2380 1.1 christos it with SCO. The bottom bit shows that we are compat with the
2381 1.1 christos SCO ABI. */
2382 1.1 christos p = frag_more (4);
2383 1.1 christos md_number_to_chars (p, 0x4c520000 | 0x0001, 4);
2384 1.1 christos
2385 1.1 christos /* If we knew (or cared) what the source language options were, we'd
2386 1.1 christos fill them in here. SCO has given us permission to ignore these
2387 1.1 christos and just set them to zero. */
2388 1.1 christos p = frag_more (4);
2389 1.1 christos md_number_to_chars (p, 0x0000, 4);
2390 1.1 christos
2391 1.1 christos frag_align (2, 0, 0);
2392 1.1 christos
2393 1.1 christos /* We probably can't restore the current segment, for there likely
2394 1.1 christos isn't one yet... */
2395 1.1 christos if (seg && subseg)
2396 1.1 christos subseg_set (seg, subseg);
2397 1.1 christos
2398 1.1 christos }
2399 1.1 christos
2400 1.1 christos #endif /* SCO_ELF */
2401 1.1 christos
2402 1.1 christos static void
2403 1.1 christos elf_generate_asm_lineno (void)
2404 1.1 christos {
2405 1.1 christos #ifdef NEED_ECOFF_DEBUG
2406 1.1 christos if (ECOFF_DEBUGGING)
2407 1.1 christos ecoff_generate_asm_lineno ();
2408 1.1 christos #endif
2409 1.1 christos }
2410 1.1 christos
2411 1.1 christos static void
2412 1.1 christos elf_process_stab (segT sec ATTRIBUTE_UNUSED,
2413 1.1 christos int what ATTRIBUTE_UNUSED,
2414 1.1 christos const char *string ATTRIBUTE_UNUSED,
2415 1.1 christos int type ATTRIBUTE_UNUSED,
2416 1.1 christos int other ATTRIBUTE_UNUSED,
2417 1.1 christos int desc ATTRIBUTE_UNUSED)
2418 1.1 christos {
2419 1.1 christos #ifdef NEED_ECOFF_DEBUG
2420 1.1 christos if (ECOFF_DEBUGGING)
2421 1.1 christos ecoff_stab (sec, what, string, type, other, desc);
2422 1.1 christos #endif
2423 1.1 christos }
2424 1.1 christos
2425 1.1 christos static int
2426 1.1 christos elf_separate_stab_sections (void)
2427 1.1 christos {
2428 1.1 christos #ifdef NEED_ECOFF_DEBUG
2429 1.1 christos return (!ECOFF_DEBUGGING);
2430 1.1 christos #else
2431 1.1 christos return 1;
2432 1.1 christos #endif
2433 1.1 christos }
2434 1.1 christos
2435 1.1 christos static void
2436 1.1 christos elf_init_stab_section (segT seg)
2437 1.1 christos {
2438 1.1 christos #ifdef NEED_ECOFF_DEBUG
2439 1.1 christos if (!ECOFF_DEBUGGING)
2440 1.1 christos #endif
2441 1.1 christos obj_elf_init_stab_section (seg);
2442 1.1 christos }
2443 1.1 christos
2444 1.1 christos const struct format_ops elf_format_ops =
2445 1.1 christos {
2446 1.1 christos bfd_target_elf_flavour,
2447 1.1 christos 0, /* dfl_leading_underscore */
2448 1.1 christos 1, /* emit_section_symbols */
2449 1.1 christos elf_begin,
2450 1.1 christos elf_file_symbol,
2451 1.1 christos elf_frob_symbol,
2452 1.1 christos elf_frob_file,
2453 1.1 christos elf_frob_file_before_adjust,
2454 1.1 christos 0, /* obj_frob_file_before_fix */
2455 1.1 christos elf_frob_file_after_relocs,
2456 1.1 christos elf_s_get_size, elf_s_set_size,
2457 1.1 christos elf_s_get_align, elf_s_set_align,
2458 1.1 christos elf_s_get_other,
2459 1.1 christos elf_s_set_other,
2460 1.1 christos 0, /* s_get_desc */
2461 1.1 christos 0, /* s_set_desc */
2462 1.1 christos 0, /* s_get_type */
2463 1.1 christos 0, /* s_set_type */
2464 1.1 christos elf_copy_symbol_attributes,
2465 1.1 christos elf_generate_asm_lineno,
2466 1.1 christos elf_process_stab,
2467 1.1 christos elf_separate_stab_sections,
2468 1.1 christos elf_init_stab_section,
2469 1.1 christos elf_sec_sym_ok_for_reloc,
2470 1.1 christos elf_pop_insert,
2471 1.1 christos #ifdef NEED_ECOFF_DEBUG
2472 1.1 christos elf_ecoff_set_ext,
2473 1.1 christos #else
2474 1.1 christos 0, /* ecoff_set_ext */
2475 1.1 christos #endif
2476 1.1 christos elf_obj_read_begin_hook,
2477 1.1 christos elf_obj_symbol_new_hook,
2478 1.1 christos 0,
2479 1.1 christos elf_adjust_symtab
2480 1.1 christos };
2481