1 /* ELF object file format
2 Copyright (C) 1992, 1993 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2,
9 or (at your option) any later version.
11 GAS is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14 the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public
17 License along with GAS; see the file COPYING. If not, write
18 to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22 #include "aout/stab_gnu.h"
25 static void obj_elf_stab
PARAMS ((int what
));
26 static void obj_elf_xstab
PARAMS ((int what
));
27 static void obj_elf_line
PARAMS ((void));
28 void obj_elf_desc
PARAMS ((void));
29 void obj_elf_version
PARAMS ((void));
30 static void obj_elf_size
PARAMS ((void));
31 static void obj_elf_type
PARAMS ((void));
32 static void obj_elf_ident
PARAMS ((void));
33 static void obj_elf_weak
PARAMS ((void));
34 static void obj_elf_local
PARAMS ((void));
35 static void obj_elf_common
PARAMS ((void));
37 const pseudo_typeS obj_pseudo_table
[] =
39 {"comm", obj_elf_common
, 0},
40 {"ident", obj_elf_ident
, 0},
41 {"local", obj_elf_local
, 0},
42 {"previous", obj_elf_previous
, 0},
43 {"section", obj_elf_section
, 0},
44 {"size", obj_elf_size
, 0},
45 {"type", obj_elf_type
, 0},
46 {"version", obj_elf_version
, 0},
47 {"weak", obj_elf_weak
, 0},
49 /* These are used for stabs-in-elf configurations. */
50 {"desc", obj_elf_desc
, 0},
51 {"line", obj_elf_line
, 0},
52 {"stabd", obj_elf_stab
, 'd'},
53 {"stabn", obj_elf_stab
, 'n'},
54 {"stabs", obj_elf_stab
, 's'},
55 /* This is used on Solaris 2.x on SPARC, but not supported yet. */
56 {"xstabs", obj_elf_xstab
, 's'},
58 /* These are used for dwarf. */
63 {NULL
} /* end sentinel */
67 #include "aout/aout64.h"
75 sym
= symbol_new (s
, absolute_section
, (valueT
) 0, (struct frag
*) 0);
76 sym
->sy_frag
= &zero_address_frag
;
77 sym
->bsym
->flags
|= BSF_FILE
;
79 if (symbol_rootP
!= sym
)
81 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
82 symbol_insert (sym
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
84 verify_symbol_chain (symbol_rootP
, symbol_lastP
);
98 name
= input_line_pointer
;
99 c
= get_symbol_end ();
100 /* just after name is now '\0' */
101 p
= input_line_pointer
;
104 if (*input_line_pointer
!= ',')
106 as_bad ("Expected comma after symbol-name");
107 ignore_rest_of_line ();
110 input_line_pointer
++; /* skip ',' */
111 if ((temp
= get_absolute_expression ()) < 0)
113 as_bad (".COMMon length (%d.) <0! Ignored.", temp
);
114 ignore_rest_of_line ();
119 symbolP
= symbol_find_or_make (name
);
121 if (S_IS_DEFINED (symbolP
))
123 as_bad ("Ignoring attempt to re-define symbol");
124 ignore_rest_of_line ();
127 if (S_GET_VALUE (symbolP
) != 0)
129 if (S_GET_VALUE (symbolP
) != size
)
131 as_warn ("Length of .comm \"%s\" is already %ld. Not changed to %d.",
132 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), size
);
135 know (symbolP
->sy_frag
== &zero_address_frag
);
136 if (*input_line_pointer
!= ',')
138 as_bad ("Expected comma after common length");
139 ignore_rest_of_line ();
142 input_line_pointer
++;
144 if (*input_line_pointer
!= '"')
146 temp
= get_absolute_expression ();
150 as_warn ("Common alignment negative; 0 assumed");
161 old_subsec
= now_subseg
;
163 record_alignment (bss_section
, align
);
164 subseg_set (bss_section
, 0);
166 frag_align (align
, 0);
167 if (S_GET_SEGMENT (symbolP
) == bss_section
)
168 symbolP
->sy_frag
->fr_symbol
= 0;
169 symbolP
->sy_frag
= frag_now
;
170 p
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
, size
,
173 S_SET_SEGMENT (symbolP
, bss_section
);
174 S_CLEAR_EXTERNAL (symbolP
);
175 subseg_set (old_sec
, old_subsec
);
180 S_SET_VALUE (symbolP
, size
);
181 S_SET_EXTERNAL (symbolP
);
182 /* should be common, but this is how gas does it for now */
183 S_SET_SEGMENT (symbolP
, &bfd_und_section
);
188 input_line_pointer
++;
189 /* @@ Some use the dot, some don't. Can we get some consistency?? */
190 if (*input_line_pointer
== '.')
191 input_line_pointer
++;
192 /* @@ Some say data, some say bss. */
193 if (strncmp (input_line_pointer
, "bss\"", 4)
194 && strncmp (input_line_pointer
, "data\"", 5))
196 while (*--input_line_pointer
!= '"')
198 input_line_pointer
--;
199 goto bad_common_segment
;
201 while (*input_line_pointer
++ != '"')
203 goto allocate_common
;
205 demand_empty_rest_of_line ();
210 p
= input_line_pointer
;
211 while (*p
&& *p
!= '\n')
215 as_bad ("bad .common segment %s", input_line_pointer
+ 1);
217 input_line_pointer
= p
;
218 ignore_rest_of_line ();
232 name
= input_line_pointer
;
233 c
= get_symbol_end ();
234 symbolP
= symbol_find_or_make (name
);
235 *input_line_pointer
= c
;
237 S_CLEAR_EXTERNAL (symbolP
);
241 input_line_pointer
++;
243 if (*input_line_pointer
== '\n')
248 demand_empty_rest_of_line ();
260 name
= input_line_pointer
;
261 c
= get_symbol_end ();
262 symbolP
= symbol_find_or_make (name
);
263 *input_line_pointer
= c
;
265 S_SET_WEAK (symbolP
);
269 input_line_pointer
++;
271 if (*input_line_pointer
== '\n')
276 demand_empty_rest_of_line ();
279 static segT previous_section
;
280 static int previous_subsection
;
283 obj_elf_section (xxx
)
289 /* Initialize this with inclusive-or of all flags that can be cleared
290 by attributes, but not set by them. Also include flags that won't
291 get set properly in the assembler, but which the user/compiler
292 shouldn't be expected to set. */
293 flagword flags
= SEC_READONLY
| SEC_ALLOC
| SEC_RELOC
;
294 /* Initialize this with the default flags to be used if none are
296 flagword default_flags
= 0;
299 /* Get name of section. */
300 if (*input_line_pointer
== '"')
301 string
= demand_copy_C_string (&xxx
);
304 char *p
= input_line_pointer
;
306 while (0 == strchr ("\n\t,; ", *p
))
310 string
= xmalloc (p
- input_line_pointer
+ 1);
311 strcpy (string
, input_line_pointer
);
313 input_line_pointer
= p
;
315 if (!strcmp (string
, ".rodata"))
316 default_flags
= SEC_ALLOC
| SEC_READONLY
| SEC_RELOC
| SEC_LOAD
;
317 else if (!strcmp (string
, ".init")
318 || !strcmp (string
, ".fini"))
319 default_flags
= SEC_ALLOC
| SEC_READONLY
| SEC_RELOC
| SEC_CODE
| SEC_LOAD
;
322 if (*input_line_pointer
!= ',')
323 flags
= default_flags
;
324 while (*input_line_pointer
== ',')
330 input_line_pointer
++;
332 /* Under i386-svr4, gcc emits a string here. I don't know what this
333 string is supposed to signify or how to handle it. Ignore it for
334 now, unless it becomes a problem. */
335 if (*input_line_pointer
== '"')
337 demand_copy_C_string (&xxx
);
342 if (*input_line_pointer
!= '#' && *input_line_pointer
!= '@')
344 as_bad ("unrecognized syntax in .section command");
345 ignore_rest_of_line ();
348 input_line_pointer
++;
350 #define CHECK(X,BIT,NEG) \
351 if (!strncmp(X,input_line_pointer,len = sizeof(X) - 1)) { \
352 bit = BIT; inv = NEG; goto match; }
354 CHECK ("write", SEC_READONLY
, 1);
355 CHECK ("alloc", SEC_ALLOC
, 0);
356 CHECK ("execinstr", SEC_CODE
, 1);
357 CHECK ("progbits", SEC_LOAD
, 1);
360 p
= input_line_pointer
;
361 while (!is_end_of_line
[(unsigned char) *p
] && *p
!= 0 && *p
!= ',')
365 as_bad ("unrecognized section attribute `%s' ignored",
375 input_line_pointer
+= len
;
377 demand_empty_rest_of_line ();
379 /* If the C string wasn't valid, `string' could be null. */
383 sec
= bfd_get_section_by_name (stdoutput
, string
);
386 sec
= subseg_new (string
, 0);
387 bfd_set_section_flags (stdoutput
, sec
, flags
);
388 sec
->output_section
= sec
;
390 previous_section
= now_seg
;
391 previous_subsection
= now_subseg
;
398 if (previous_section
== 0)
400 as_bad (".previous without corresponding .section; ignored");
403 subseg_set (previous_section
, previous_subsection
);
404 previous_section
= 0;
408 obj_elf_write_symbol_p (sym
)
411 /* If this is a local symbol, are there any relocations for which
414 /* To find this out, we examine all relocations in all bfd sections
415 that have relocations. If there is one that references this
416 symbol, we need to keep this symbol. In this case, we return a
417 true status. In all other cases, we return a false status. */
419 if (S_IS_LOCAL (sym
))
421 asymbol
*bsym
= sym
->bsym
;
422 bfd
*abfd
= bsym
->the_bfd
;
425 for (bsec
= abfd
->sections
; bsec
; bsec
= bsec
->next
)
427 struct reloc_cache_entry
**rlocs
= bsec
->orelocation
;
428 int rcnt
= bsec
->reloc_count
;
434 for (i
= 0; i
< rcnt
; i
++)
435 if (rlocs
[i
]->sym_ptr_ptr
436 && rlocs
[i
]->sym_ptr_ptr
[0] == bsym
)
441 /* No relocations for this section. Check the seg_info
442 structure to see if there are any fixups for this
444 segment_info_type
*seginfo
= seg_info (bsec
);
447 for (fixp
= seginfo
->fix_root
; fixp
; fixp
= fixp
->fx_next
)
448 if ((fixp
->fx_addsy
&& fixp
->fx_addsy
->bsym
== bsym
)
449 || (fixp
->fx_subsy
&& fixp
->fx_subsy
->bsym
== bsym
))
458 obj_elf_write_symbol (sym
)
461 return /* obj_elf_write_symbol_p (sym) || */ !S_IS_LOCAL (sym
);
465 obj_elf_frob_symbol (sym
, punt
)
469 #if 0 /* ?? The return value is ignored. Only the value of *punt is
471 return obj_elf_write_symbol_p (sym
);
473 /* FIXME: Just return 0 until is fixed. */
480 /* Assume delimiter is part of expression. BSD4.2 as fails with
481 delightful bug, so we are not being incompatible here. */
482 new_logical_line ((char *) NULL
, (int) (get_absolute_expression ()));
483 demand_empty_rest_of_line ();
489 * Handle .stabX directives, which used to be open-coded.
490 * So much creeping featurism overloaded the semantics that we decided
491 * to put all .stabX thinking in one place. Here.
493 * We try to make any .stabX directive legal. Other people's AS will often
494 * do assembly-time consistency checks: eg assigning meaning to n_type bits
495 * and "protecting" you from setting them to certain values. (They also zero
496 * certain bits before emitting symbols. Tut tut.)
498 * If an expression is not absolute we either gripe or use the relocation
499 * information. Other people's assemblers silently forget information they
500 * don't need and invent information they need that you didn't supply.
502 * .stabX directives always make a symbol table entry. It may be junk if
503 * the rest of your .stabX directive is malformed.
507 * elf_stab_symbol_string()
509 * Build a string dictionary entry for a .stabX symbol.
510 * The symbol is added to the .stabstr section.
515 elf_stab_symbol_string (string
, secname
)
516 char *string
, *secname
;
522 unsigned int old_gdb_string_index
;
526 /* @@FIXME -- there should be no static data here!
527 This also has the effect of making all stab string tables large enough
528 to contain all the contents written to any of them. This only matters
529 with the Solaris native compiler for the moment, but it should be fixed
531 static unsigned int gdb_string_index
= 0;
533 old_gdb_string_index
= 0;
534 length
= strlen (string
);
535 clengthP
= (char *) &length
;
537 { /* Ordinary case. */
539 save_subseg
= now_subseg
;
541 /* Create the stab sections, if they are not already created. */
543 char *newsecname
= xmalloc (strlen (secname
) + 4);
544 strcpy (newsecname
, secname
);
545 strcat (newsecname
, "str");
546 seg
= bfd_get_section_by_name (stdoutput
, newsecname
);
549 seg
= bfd_make_section_old_way (stdoutput
, newsecname
);
550 bfd_set_section_flags (stdoutput
, seg
,
551 SEC_LOAD
| SEC_READONLY
| SEC_ALLOC
);
553 /* free (newsecname);*/
555 subseg_new ((char *) seg
->name
, save_subseg
);
556 old_gdb_string_index
= gdb_string_index
;
558 while ((c
= *string
++))
562 FRAG_APPEND_1_CHAR (c
);
565 FRAG_APPEND_1_CHAR ((char) 0);
571 FRAG_APPEND_1_CHAR ((char) 0);
575 subseg_new ((char *) save_seg
->name
, save_subseg
);
578 return old_gdb_string_index
;
582 DEFUN (elf_stab_symbol
, (symbolP
, stab_type
),
589 /* the string index portion of the stab */
590 md_number_to_chars (toP
, (valueT
) symbolP
->sy_name_offset
, 4);
591 md_number_to_chars (toP
+ 4, (valueT
) S_GET_TYPE (symbolP
), 1);
592 md_number_to_chars (toP
+ 5, (valueT
) S_GET_OTHER (symbolP
), 1);
593 md_number_to_chars (toP
+ 6, (valueT
) S_GET_DESC (symbolP
), 2);
594 /* The n_value field doesn't get written here, it gets done below. It
595 may be an expression needing relocating. */
599 obj_elf_stab_generic (what
, secname
)
605 symbolS
*symbolP
= 0;
612 asection
*saved_seg
= now_seg
;
614 subsegT subseg
= now_subseg
;
617 /* This function doesn't work yet.
619 Actually, this function is okay, but some finalizations are
620 needed before writing the object file; that's not done yet, and
621 the Solaris linker chokes without it.
623 In any case, this should effectively disable it for now. */
625 demand_copy_C_string (&length
);
630 seg
= bfd_get_section_by_name (stdoutput
, secname
);
633 seg
= subseg_new (secname
, 0);
634 bfd_set_section_flags (stdoutput
, seg
,
635 SEC_LOAD
| SEC_READONLY
| SEC_ALLOC
| SEC_RELOC
);
636 subseg_set (saved_seg
, subseg
);
641 * Enter with input_line_pointer pointing past .stabX and any following
646 string
= demand_copy_C_string (&length
);
648 if (*input_line_pointer
== ',')
649 input_line_pointer
++;
652 as_bad ("I need a comma after symbol's name");
660 * Input_line_pointer->after ','. String->symbol name.
664 symbolP
= symbol_new (string
, &bfd_und_section
, (valueT
) 0, (struct frag
*) 0);
666 /* enter the string in the .stab string table (section .stabstr) */
667 symbolP
->sy_name_offset
= elf_stab_symbol_string (string
, secname
);
672 S_SET_NAME (symbolP
, NULL
); /* .stabd feature. */
673 S_SET_VALUE (symbolP
,
674 (valueT
) ((char*) obstack_next_free (&frags
) - frag_now
->fr_literal
));
675 S_SET_SEGMENT (symbolP
, now_seg
);
676 symbolP
->sy_frag
= frag_now
;
680 symbolP
->sy_frag
= &zero_address_frag
;
684 symbolP
->sy_frag
= &zero_address_frag
;
692 if (get_absolute_expression_and_terminator (&longint
) == ',')
694 saved_type
= longint
;
695 S_SET_TYPE (symbolP
, saved_type
);
699 as_bad ("I want a comma after the n_type expression");
701 input_line_pointer
--; /* Backup over a non-',' char. */
707 if (get_absolute_expression_and_terminator (&longint
) == ',')
708 S_SET_OTHER (symbolP
, longint
);
711 as_bad ("I want a comma after the n_other expression");
713 input_line_pointer
--; /* Backup over a non-',' char. */
719 S_SET_DESC (symbolP
, get_absolute_expression ());
720 if (what
== 's' || what
== 'n')
722 if (*input_line_pointer
!= ',')
724 as_bad ("I want a comma after the n_desc expression");
729 input_line_pointer
++;
736 ignore_rest_of_line ();
740 subseg_new ((char *) seg
->name
, subseg
);
743 /* allocate and discard -- filled in later */
744 (void) frag_more (12);
746 /* Emit the stab symbol. */
747 elf_stab_symbol (symbolP
, what
);
749 if (what
== 's' || what
== 'n')
752 input_line_pointer
--;
756 char *p
= frag_more (4);
757 md_number_to_chars (p
, 0, 4);
760 subseg_new ((char *) saved_seg
->name
, subseg
);
762 if ((what
== 's' || what
== 'n')
763 && symbolP
->sy_value
.X_op
== O_constant
)
765 /* symbol is not needed in the regular symbol table */
766 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
769 if (what
== 's' && S_GET_TYPE (symbolP
) == N_SO
)
771 fragS
*fragp
= seg_info (seg
)->frchainP
->frch_root
;
773 && fragp
->fr_address
+ fragp
->fr_fix
< 12)
774 fragp
= fragp
->fr_next
;
776 assert (fragp
->fr_type
== rs_fill
);
777 assert (fragp
->fr_address
== 0 && fragp
->fr_fix
>= 12);
778 md_number_to_chars (fragp
->fr_literal
, (valueT
) symbolP
->sy_name_offset
,
783 switch (S_GET_TYPE (symbolP
))
786 listing_source_line (S_GET_DESC (symbolP
));
790 listing_source_file (string
);
794 demand_empty_rest_of_line ();
801 obj_elf_stab_generic (what
, ".stab");
811 secname
= demand_copy_C_string (&length
);
813 if (*input_line_pointer
== ',')
814 input_line_pointer
++;
817 as_bad ("comma missing in .xstabs");
818 ignore_rest_of_line ();
821 obj_elf_stab_generic (what
, secname
);
833 /* Frob invented at RMS' request. Set the n_desc of a symbol. */
834 name
= input_line_pointer
;
835 c
= get_symbol_end ();
836 p
= input_line_pointer
;
839 if (*input_line_pointer
!= ',')
842 as_bad ("Expected comma after name \"%s\"", name
);
844 ignore_rest_of_line ();
848 input_line_pointer
++;
849 temp
= get_absolute_expression ();
851 symbolP
= symbol_find_or_make (name
);
853 S_SET_DESC (symbolP
, temp
);
855 demand_empty_rest_of_line ();
856 } /* obj_elf_desc() */
859 obj_read_begin_hook ()
864 obj_symbol_new_hook (symbolP
)
867 #if 0 /* BFD already takes care of this */
868 elf32_symbol_type
*esym
= (elf32_symbol_type
*) symbolP
;
870 /* There is an Elf_Internal_Sym and an Elf_External_Sym. For now,
871 just zero them out. */
873 bzero ((char *) &esym
->internal_elf_sym
, sizeof (esym
->internal_elf_sym
));
874 bzero ((char *) &esym
->native_elf_sym
, sizeof (esym
->native_elf_sym
));
875 bzero ((char *) &esym
->tc_data
, sizeof (esym
->tc_data
));
886 asection
*seg
= now_seg
;
887 subsegT subseg
= now_subseg
;
888 Elf_Internal_Note i_note
;
889 Elf_External_Note e_note
;
890 asection
*note_secp
= (asection
*) NULL
;
894 if (*input_line_pointer
== '\"')
896 ++input_line_pointer
; /* -> 1st char of string. */
897 name
= input_line_pointer
;
899 while (is_a_char (c
= next_char_of_string ()))
901 c
= *input_line_pointer
;
902 *input_line_pointer
= '\0';
903 *(input_line_pointer
- 1) = '\0';
904 *input_line_pointer
= c
;
906 /* create the .note section if this is the first version string */
908 note_secp
= bfd_get_section_by_name (stdoutput
, ".note");
909 if (note_secp
== (asection
*) NULL
)
911 note_secp
= bfd_make_section_old_way (stdoutput
, ".note");
912 bfd_set_section_flags (stdoutput
,
914 SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_READONLY
);
917 /* process the version string */
919 subseg_new ((char *) note_secp
->name
, 0);
922 i_note
.namesz
= ((len
+ 1) + 3) & ~3; /* round this to word boundary */
923 i_note
.descsz
= 0; /* no description */
924 i_note
.type
= NT_VERSION
;
925 p
= frag_more (sizeof (e_note
.namesz
));
926 md_number_to_chars (p
, (valueT
) i_note
.namesz
, 4);
927 p
= frag_more (sizeof (e_note
.descsz
));
928 md_number_to_chars (p
, (valueT
) i_note
.descsz
, 4);
929 p
= frag_more (sizeof (e_note
.type
));
930 md_number_to_chars (p
, (valueT
) i_note
.type
, 4);
932 for (i
= 0; i
< len
; i
++)
936 FRAG_APPEND_1_CHAR (ch
);
941 subseg_new ((char *) seg
->name
, subseg
);
945 as_bad ("Expected quoted string");
947 demand_empty_rest_of_line ();
953 char *name
= input_line_pointer
;
954 char c
= get_symbol_end ();
959 p
= input_line_pointer
;
962 if (*input_line_pointer
!= ',')
965 as_bad ("expected comma after name `%s' in .size directive", name
);
967 ignore_rest_of_line ();
970 input_line_pointer
++;
972 if (exp
.X_op
== O_absent
)
974 as_bad ("missing expression in .size directive");
975 exp
.X_op
= O_constant
;
976 exp
.X_add_number
= 0;
979 sym
= symbol_find_or_make (name
);
981 if (exp
.X_op
== O_constant
)
982 S_SET_SIZE (sym
, exp
.X_add_number
);
989 as_tsktsk (".size expressions not yet supported, ignored");
994 demand_empty_rest_of_line ();
1000 char *name
= input_line_pointer
;
1001 char c
= get_symbol_end ();
1006 p
= input_line_pointer
;
1009 if (*input_line_pointer
!= ',')
1011 as_bad ("expected comma after name in .type directive");
1013 ignore_rest_of_line ();
1016 input_line_pointer
++;
1018 if (*input_line_pointer
!= '#' && *input_line_pointer
!= '@')
1020 as_bad ("expected `#' or `@' after comma in .type directive");
1023 input_line_pointer
++;
1024 if (!strncmp ("function", input_line_pointer
, sizeof ("function") - 1))
1026 type
= BSF_FUNCTION
;
1027 input_line_pointer
+= sizeof ("function") - 1;
1029 else if (!strncmp ("object", input_line_pointer
, sizeof ("object") - 1))
1031 input_line_pointer
+= sizeof ("object") - 1;
1035 as_bad ("unrecognized symbol type, ignored");
1038 demand_empty_rest_of_line ();
1040 sym
= symbol_find_or_make (name
);
1041 sym
->bsym
->flags
|= type
;
1047 static segT comment_section
;
1048 segT old_section
= now_seg
;
1049 int old_subsection
= now_subseg
;
1051 if (!comment_section
)
1054 comment_section
= subseg_new (".comment", 0);
1055 bfd_set_section_flags (stdoutput
, comment_section
, SEC_HAS_CONTENTS
);
1060 subseg_set (comment_section
, 0);
1062 subseg_set (old_section
, old_subsection
);
1066 adjust_stab_sections (abfd
, sec
, xxx
)
1076 if (strncmp (".stab", sec
->name
, 5))
1078 if (!strcmp ("str", sec
->name
+ strlen (sec
->name
) - 3))
1081 name
= (char *) alloca (strlen (sec
->name
) + 4);
1082 strcpy (name
, sec
->name
);
1083 strcat (name
, "str");
1084 strsec
= bfd_get_section_by_name (abfd
, name
);
1086 strsz
= bfd_section_size (abfd
, strsec
);
1089 nsyms
= bfd_section_size (abfd
, sec
) / 12 - 1;
1091 fragp
= seg_info (sec
)->frchainP
->frch_root
;
1093 && fragp
->fr_address
+ fragp
->fr_fix
< 12)
1094 fragp
= fragp
->fr_next
;
1095 assert (fragp
!= 0);
1096 assert (fragp
->fr_type
== rs_fill
);
1097 assert (fragp
->fr_address
== 0 && fragp
->fr_fix
>= 12);
1099 bfd_h_put_16 (abfd
, nsyms
, fragp
->fr_literal
+ 6);
1100 bfd_h_put_32 (abfd
, strsz
, fragp
->fr_literal
+ 8);
1106 bfd_map_over_sections (stdoutput
, adjust_stab_sections
, (PTR
) 0);
1108 #ifdef elf_tc_symbol
1112 for (i
= 0; i
< stdoutput
->symcount
; i
++)
1113 elf_tc_symbol (stdoutput
, (PTR
) (stdoutput
->outsymbols
[i
]),
1118 #ifdef elf_tc_final_processing
1119 elf_tc_final_processing ();
1122 /* Finally, we must make any target-specific sections. */
1124 #ifdef elf_tc_make_sections
1125 elf_tc_make_sections (stdoutput
);