1ed0d50c3Schristos /* ldemul.c -- clearing house for ld emulation states
2*b88e3e88Schristos    Copyright (C) 1991-2020 Free Software Foundation, Inc.
3ed0d50c3Schristos 
4ed0d50c3Schristos    This file is part of the GNU Binutils.
5ed0d50c3Schristos 
6ed0d50c3Schristos    This program is free software; you can redistribute it and/or modify
7ed0d50c3Schristos    it under the terms of the GNU General Public License as published by
8ed0d50c3Schristos    the Free Software Foundation; either version 3 of the License, or
9ed0d50c3Schristos    (at your option) any later version.
10ed0d50c3Schristos 
11ed0d50c3Schristos    This program is distributed in the hope that it will be useful,
12ed0d50c3Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
13ed0d50c3Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14ed0d50c3Schristos    GNU General Public License for more details.
15ed0d50c3Schristos 
16ed0d50c3Schristos    You should have received a copy of the GNU General Public License
17ed0d50c3Schristos    along with this program; if not, write to the Free Software
18ed0d50c3Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19ed0d50c3Schristos    MA 02110-1301, USA.  */
20ed0d50c3Schristos 
21ed0d50c3Schristos #include "sysdep.h"
22ed0d50c3Schristos #include "bfd.h"
23ed0d50c3Schristos #include "getopt.h"
24ed0d50c3Schristos #include "bfdlink.h"
25*b88e3e88Schristos #include "ctf-api.h"
26ed0d50c3Schristos 
27ed0d50c3Schristos #include "ld.h"
28ed0d50c3Schristos #include "ldmisc.h"
29ed0d50c3Schristos #include "ldexp.h"
30ed0d50c3Schristos #include "ldlang.h"
31ed0d50c3Schristos #include "ldfile.h"
32ed0d50c3Schristos #include "ldemul.h"
33ed0d50c3Schristos #include "ldmain.h"
34ed0d50c3Schristos #include "ldemul-list.h"
35ed0d50c3Schristos 
36ed0d50c3Schristos static ld_emulation_xfer_type *ld_emulation;
37ed0d50c3Schristos 
38ed0d50c3Schristos void
ldemul_hll(char * name)39ed0d50c3Schristos ldemul_hll (char *name)
40ed0d50c3Schristos {
41ed0d50c3Schristos   ld_emulation->hll (name);
42ed0d50c3Schristos }
43ed0d50c3Schristos 
44ed0d50c3Schristos void
ldemul_syslib(char * name)45ed0d50c3Schristos ldemul_syslib (char *name)
46ed0d50c3Schristos {
47ed0d50c3Schristos   ld_emulation->syslib (name);
48ed0d50c3Schristos }
49ed0d50c3Schristos 
50ed0d50c3Schristos void
ldemul_after_parse(void)51ed0d50c3Schristos ldemul_after_parse (void)
52ed0d50c3Schristos {
53ed0d50c3Schristos   ld_emulation->after_parse ();
54ed0d50c3Schristos }
55ed0d50c3Schristos 
56ed0d50c3Schristos void
ldemul_before_parse(void)57ed0d50c3Schristos ldemul_before_parse (void)
58ed0d50c3Schristos {
59ed0d50c3Schristos   ld_emulation->before_parse ();
60ed0d50c3Schristos }
61ed0d50c3Schristos 
62ed0d50c3Schristos void
ldemul_after_open(void)63ed0d50c3Schristos ldemul_after_open (void)
64ed0d50c3Schristos {
65ed0d50c3Schristos   ld_emulation->after_open ();
66ed0d50c3Schristos }
67ed0d50c3Schristos 
68ed0d50c3Schristos void
ldemul_after_check_relocs(void)6906324dcfSchristos ldemul_after_check_relocs (void)
7006324dcfSchristos {
7106324dcfSchristos   ld_emulation->after_check_relocs ();
7206324dcfSchristos }
7306324dcfSchristos 
7406324dcfSchristos void
ldemul_after_allocation(void)75ed0d50c3Schristos ldemul_after_allocation (void)
76ed0d50c3Schristos {
77ed0d50c3Schristos   ld_emulation->after_allocation ();
78ed0d50c3Schristos }
79ed0d50c3Schristos 
80ed0d50c3Schristos void
ldemul_before_allocation(void)81ed0d50c3Schristos ldemul_before_allocation (void)
82ed0d50c3Schristos {
83ed0d50c3Schristos   ld_emulation->before_allocation ();
84ed0d50c3Schristos }
85ed0d50c3Schristos 
86ed0d50c3Schristos void
ldemul_set_output_arch(void)87ed0d50c3Schristos ldemul_set_output_arch (void)
88ed0d50c3Schristos {
89ed0d50c3Schristos   ld_emulation->set_output_arch ();
90ed0d50c3Schristos }
91ed0d50c3Schristos 
92ed0d50c3Schristos void
ldemul_finish(void)93ed0d50c3Schristos ldemul_finish (void)
94ed0d50c3Schristos {
95ed0d50c3Schristos   ld_emulation->finish ();
96ed0d50c3Schristos }
97ed0d50c3Schristos 
98ed0d50c3Schristos void
ldemul_set_symbols(void)99ed0d50c3Schristos ldemul_set_symbols (void)
100ed0d50c3Schristos {
101ed0d50c3Schristos   if (ld_emulation->set_symbols)
102ed0d50c3Schristos     ld_emulation->set_symbols ();
103ed0d50c3Schristos }
104ed0d50c3Schristos 
105ed0d50c3Schristos void
ldemul_create_output_section_statements(void)106ed0d50c3Schristos ldemul_create_output_section_statements (void)
107ed0d50c3Schristos {
108ed0d50c3Schristos   if (ld_emulation->create_output_section_statements)
109ed0d50c3Schristos     ld_emulation->create_output_section_statements ();
110ed0d50c3Schristos }
111ed0d50c3Schristos 
112ed0d50c3Schristos char *
ldemul_get_script(int * isfile)113ed0d50c3Schristos ldemul_get_script (int *isfile)
114ed0d50c3Schristos {
115ed0d50c3Schristos   return ld_emulation->get_script (isfile);
116ed0d50c3Schristos }
117ed0d50c3Schristos 
118ed0d50c3Schristos bfd_boolean
ldemul_open_dynamic_archive(const char * arch,search_dirs_type * search,lang_input_statement_type * entry)119ed0d50c3Schristos ldemul_open_dynamic_archive (const char *arch, search_dirs_type *search,
120ed0d50c3Schristos 			     lang_input_statement_type *entry)
121ed0d50c3Schristos {
122ed0d50c3Schristos   if (ld_emulation->open_dynamic_archive)
123ed0d50c3Schristos     return (*ld_emulation->open_dynamic_archive) (arch, search, entry);
124ed0d50c3Schristos   return FALSE;
125ed0d50c3Schristos }
126ed0d50c3Schristos 
127ed0d50c3Schristos lang_output_section_statement_type *
ldemul_place_orphan(asection * s,const char * name,int constraint)128ed0d50c3Schristos ldemul_place_orphan (asection *s, const char *name, int constraint)
129ed0d50c3Schristos {
130ed0d50c3Schristos   if (ld_emulation->place_orphan)
131ed0d50c3Schristos     return (*ld_emulation->place_orphan) (s, name, constraint);
132ed0d50c3Schristos   return NULL;
133ed0d50c3Schristos }
134ed0d50c3Schristos 
135ed0d50c3Schristos void
ldemul_add_options(int ns,char ** shortopts,int nl,struct option ** longopts,int nrl,struct option ** really_longopts)136ed0d50c3Schristos ldemul_add_options (int ns, char **shortopts, int nl,
137ed0d50c3Schristos 		    struct option **longopts, int nrl,
138ed0d50c3Schristos 		    struct option **really_longopts)
139ed0d50c3Schristos {
140ed0d50c3Schristos   if (ld_emulation->add_options)
141ed0d50c3Schristos     (*ld_emulation->add_options) (ns, shortopts, nl, longopts,
142ed0d50c3Schristos 				  nrl, really_longopts);
143ed0d50c3Schristos }
144ed0d50c3Schristos 
145ed0d50c3Schristos bfd_boolean
ldemul_handle_option(int optc)146ed0d50c3Schristos ldemul_handle_option (int optc)
147ed0d50c3Schristos {
148ed0d50c3Schristos   if (ld_emulation->handle_option)
149ed0d50c3Schristos     return (*ld_emulation->handle_option) (optc);
150ed0d50c3Schristos   return FALSE;
151ed0d50c3Schristos }
152ed0d50c3Schristos 
153ed0d50c3Schristos bfd_boolean
ldemul_parse_args(int argc,char ** argv)154ed0d50c3Schristos ldemul_parse_args (int argc, char **argv)
155ed0d50c3Schristos {
156ed0d50c3Schristos   /* Try and use the emulation parser if there is one.  */
157ed0d50c3Schristos   if (ld_emulation->parse_args)
158ed0d50c3Schristos     return (*ld_emulation->parse_args) (argc, argv);
159ed0d50c3Schristos   return FALSE;
160ed0d50c3Schristos }
161ed0d50c3Schristos 
162ed0d50c3Schristos /* Let the emulation code handle an unrecognized file.  */
163ed0d50c3Schristos 
164ed0d50c3Schristos bfd_boolean
ldemul_unrecognized_file(lang_input_statement_type * entry)165ed0d50c3Schristos ldemul_unrecognized_file (lang_input_statement_type *entry)
166ed0d50c3Schristos {
167ed0d50c3Schristos   if (ld_emulation->unrecognized_file)
168ed0d50c3Schristos     return (*ld_emulation->unrecognized_file) (entry);
169ed0d50c3Schristos   return FALSE;
170ed0d50c3Schristos }
171ed0d50c3Schristos 
172ed0d50c3Schristos /* Let the emulation code handle a recognized file.  */
173ed0d50c3Schristos 
174ed0d50c3Schristos bfd_boolean
ldemul_recognized_file(lang_input_statement_type * entry)175ed0d50c3Schristos ldemul_recognized_file (lang_input_statement_type *entry)
176ed0d50c3Schristos {
177ed0d50c3Schristos   if (ld_emulation->recognized_file)
178ed0d50c3Schristos     return (*ld_emulation->recognized_file) (entry);
179ed0d50c3Schristos   return FALSE;
180ed0d50c3Schristos }
181ed0d50c3Schristos 
182ed0d50c3Schristos char *
ldemul_choose_target(int argc,char ** argv)183ed0d50c3Schristos ldemul_choose_target (int argc, char **argv)
184ed0d50c3Schristos {
185ed0d50c3Schristos   return ld_emulation->choose_target (argc, argv);
186ed0d50c3Schristos }
187ed0d50c3Schristos 
188ed0d50c3Schristos 
189ed0d50c3Schristos /* The default choose_target function.  */
190ed0d50c3Schristos 
191ed0d50c3Schristos char *
ldemul_default_target(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)192ed0d50c3Schristos ldemul_default_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
193ed0d50c3Schristos {
194ed0d50c3Schristos   char *from_outside = getenv (TARGET_ENVIRON);
195ed0d50c3Schristos   if (from_outside != (char *) NULL)
196ed0d50c3Schristos     return from_outside;
197ed0d50c3Schristos   return ld_emulation->target_name;
198ed0d50c3Schristos }
199ed0d50c3Schristos 
200ed0d50c3Schristos /* If the entry point was not specified as an address, then add the
201ed0d50c3Schristos    symbol as undefined.  This will cause ld to extract an archive
202ed0d50c3Schristos    element defining the entry if ld is linking against such an archive.
203ed0d50c3Schristos 
204ed0d50c3Schristos    We don't do this when generating shared libraries unless given -e
205ed0d50c3Schristos    on the command line, because most shared libs are not designed to
206ed0d50c3Schristos    be run as an executable.  However, some are, eg. glibc ld.so and
207ed0d50c3Schristos    may rely on the default linker script supplying ENTRY.  So we can't
208ed0d50c3Schristos    remove the ENTRY from the script, but would rather not insert
209ed0d50c3Schristos    undefined _start syms.  */
210ed0d50c3Schristos 
211ed0d50c3Schristos void
after_parse_default(void)212ed0d50c3Schristos after_parse_default (void)
213ed0d50c3Schristos {
214ed0d50c3Schristos   if (entry_symbol.name != NULL
215ed0d50c3Schristos       && (bfd_link_executable (&link_info) || entry_from_cmdline))
216ed0d50c3Schristos     {
217ed0d50c3Schristos       bfd_boolean is_vma = FALSE;
218ed0d50c3Schristos 
219ed0d50c3Schristos       if (entry_from_cmdline)
220ed0d50c3Schristos 	{
221ed0d50c3Schristos 	  const char *send;
222ed0d50c3Schristos 
223ed0d50c3Schristos 	  bfd_scan_vma (entry_symbol.name, &send, 0);
224ed0d50c3Schristos 	  is_vma = *send == '\0';
225ed0d50c3Schristos 	}
226ed0d50c3Schristos       if (!is_vma)
227ed0d50c3Schristos 	ldlang_add_undef (entry_symbol.name, entry_from_cmdline);
228ed0d50c3Schristos     }
22906324dcfSchristos   if (config.maxpagesize == 0)
23006324dcfSchristos     config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
23106324dcfSchristos   if (config.commonpagesize == 0)
23206324dcfSchristos     config.commonpagesize = bfd_emul_get_commonpagesize (default_target,
23306324dcfSchristos 							 link_info.relro);
234ed0d50c3Schristos }
235ed0d50c3Schristos 
236ed0d50c3Schristos void
after_open_default(void)237ed0d50c3Schristos after_open_default (void)
238ed0d50c3Schristos {
239*b88e3e88Schristos   link_info.big_endian = TRUE;
240*b88e3e88Schristos 
241*b88e3e88Schristos   if (bfd_big_endian (link_info.output_bfd))
242*b88e3e88Schristos     ;
243*b88e3e88Schristos   else if (bfd_little_endian (link_info.output_bfd))
244*b88e3e88Schristos     link_info.big_endian = FALSE;
245*b88e3e88Schristos   else
246*b88e3e88Schristos     {
247*b88e3e88Schristos       if (command_line.endian == ENDIAN_BIG)
248*b88e3e88Schristos 	;
249*b88e3e88Schristos       else if (command_line.endian == ENDIAN_LITTLE)
250*b88e3e88Schristos 	link_info.big_endian = FALSE;
251*b88e3e88Schristos       else if (command_line.endian == ENDIAN_UNSET)
252*b88e3e88Schristos 	{
253*b88e3e88Schristos 	  LANG_FOR_EACH_INPUT_STATEMENT (s)
254*b88e3e88Schristos 	    if (s->the_bfd != NULL)
255*b88e3e88Schristos 	      {
256*b88e3e88Schristos 		if (bfd_little_endian (s->the_bfd))
257*b88e3e88Schristos 		  link_info.big_endian = FALSE;
258*b88e3e88Schristos 		break;
259*b88e3e88Schristos 	      }
260*b88e3e88Schristos 	}
261*b88e3e88Schristos     }
262ed0d50c3Schristos }
263ed0d50c3Schristos 
264ed0d50c3Schristos void
after_check_relocs_default(void)26506324dcfSchristos after_check_relocs_default (void)
26606324dcfSchristos {
26706324dcfSchristos }
26806324dcfSchristos 
26906324dcfSchristos void
after_allocation_default(void)270ed0d50c3Schristos after_allocation_default (void)
271ed0d50c3Schristos {
272ed0d50c3Schristos   lang_relax_sections (FALSE);
273ed0d50c3Schristos }
274ed0d50c3Schristos 
275ed0d50c3Schristos void
before_allocation_default(void)276ed0d50c3Schristos before_allocation_default (void)
277ed0d50c3Schristos {
278ed0d50c3Schristos   if (!bfd_link_relocatable (&link_info))
279ed0d50c3Schristos     strip_excluded_output_sections ();
280ed0d50c3Schristos }
281ed0d50c3Schristos 
282ed0d50c3Schristos void
finish_default(void)283ed0d50c3Schristos finish_default (void)
284ed0d50c3Schristos {
285ed0d50c3Schristos   if (!bfd_link_relocatable (&link_info))
286ed0d50c3Schristos     _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info);
287ed0d50c3Schristos }
288ed0d50c3Schristos 
289ed0d50c3Schristos void
set_output_arch_default(void)290ed0d50c3Schristos set_output_arch_default (void)
291ed0d50c3Schristos {
292ed0d50c3Schristos   /* Set the output architecture and machine if possible.  */
293ed0d50c3Schristos   bfd_set_arch_mach (link_info.output_bfd,
294ed0d50c3Schristos 		     ldfile_output_architecture, ldfile_output_machine);
295ed0d50c3Schristos 
296ed0d50c3Schristos   bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
297ed0d50c3Schristos   bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
298ed0d50c3Schristos }
299ed0d50c3Schristos 
300ed0d50c3Schristos void
syslib_default(char * ignore ATTRIBUTE_UNUSED)301ed0d50c3Schristos syslib_default (char *ignore ATTRIBUTE_UNUSED)
302ed0d50c3Schristos {
30306324dcfSchristos   info_msg (_("%pS SYSLIB ignored\n"), NULL);
304ed0d50c3Schristos }
305ed0d50c3Schristos 
306ed0d50c3Schristos void
hll_default(char * ignore ATTRIBUTE_UNUSED)307ed0d50c3Schristos hll_default (char *ignore ATTRIBUTE_UNUSED)
308ed0d50c3Schristos {
30906324dcfSchristos   info_msg (_("%pS HLL ignored\n"), NULL);
310ed0d50c3Schristos }
311ed0d50c3Schristos 
312ed0d50c3Schristos ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
313ed0d50c3Schristos 
314ed0d50c3Schristos void
ldemul_choose_mode(char * target)315ed0d50c3Schristos ldemul_choose_mode (char *target)
316ed0d50c3Schristos {
317ed0d50c3Schristos   ld_emulation_xfer_type **eptr = ld_emulations;
318ed0d50c3Schristos   /* Ignore "gld" prefix.  */
319ed0d50c3Schristos   if (target[0] == 'g' && target[1] == 'l' && target[2] == 'd')
320ed0d50c3Schristos     target += 3;
321ed0d50c3Schristos   for (; *eptr; eptr++)
322ed0d50c3Schristos     {
323ed0d50c3Schristos       if (strcmp (target, (*eptr)->emulation_name) == 0)
324ed0d50c3Schristos 	{
325ed0d50c3Schristos 	  ld_emulation = *eptr;
326ed0d50c3Schristos 	  return;
327ed0d50c3Schristos 	}
328ed0d50c3Schristos     }
329ed0d50c3Schristos   einfo (_("%P: unrecognised emulation mode: %s\n"), target);
330ed0d50c3Schristos   einfo (_("Supported emulations: "));
331ed0d50c3Schristos   ldemul_list_emulations (stderr);
332ed0d50c3Schristos   einfo ("%F\n");
333ed0d50c3Schristos }
334ed0d50c3Schristos 
335ed0d50c3Schristos void
ldemul_list_emulations(FILE * f)336ed0d50c3Schristos ldemul_list_emulations (FILE *f)
337ed0d50c3Schristos {
338ed0d50c3Schristos   ld_emulation_xfer_type **eptr = ld_emulations;
339ed0d50c3Schristos   bfd_boolean first = TRUE;
340ed0d50c3Schristos 
341ed0d50c3Schristos   for (; *eptr; eptr++)
342ed0d50c3Schristos     {
343ed0d50c3Schristos       if (first)
344ed0d50c3Schristos 	first = FALSE;
345ed0d50c3Schristos       else
346ed0d50c3Schristos 	fprintf (f, " ");
347ed0d50c3Schristos       fprintf (f, "%s", (*eptr)->emulation_name);
348ed0d50c3Schristos     }
349ed0d50c3Schristos }
350ed0d50c3Schristos 
351ed0d50c3Schristos void
ldemul_list_emulation_options(FILE * f)352ed0d50c3Schristos ldemul_list_emulation_options (FILE *f)
353ed0d50c3Schristos {
354ed0d50c3Schristos   ld_emulation_xfer_type **eptr;
355ed0d50c3Schristos   int options_found = 0;
356ed0d50c3Schristos 
357ed0d50c3Schristos   for (eptr = ld_emulations; *eptr; eptr++)
358ed0d50c3Schristos     {
359ed0d50c3Schristos       ld_emulation_xfer_type *emul = *eptr;
360ed0d50c3Schristos 
361ed0d50c3Schristos       if (emul->list_options)
362ed0d50c3Schristos 	{
363ed0d50c3Schristos 	  fprintf (f, "%s: \n", emul->emulation_name);
364ed0d50c3Schristos 
365ed0d50c3Schristos 	  emul->list_options (f);
366ed0d50c3Schristos 
367ed0d50c3Schristos 	  options_found = 1;
368ed0d50c3Schristos 	}
369ed0d50c3Schristos     }
370ed0d50c3Schristos 
371ed0d50c3Schristos   if (!options_found)
372ed0d50c3Schristos     fprintf (f, _("  no emulation specific options.\n"));
373ed0d50c3Schristos }
374ed0d50c3Schristos 
375ed0d50c3Schristos int
ldemul_find_potential_libraries(char * name,lang_input_statement_type * entry)376ed0d50c3Schristos ldemul_find_potential_libraries (char *name, lang_input_statement_type *entry)
377ed0d50c3Schristos {
378ed0d50c3Schristos   if (ld_emulation->find_potential_libraries)
379ed0d50c3Schristos     return ld_emulation->find_potential_libraries (name, entry);
380ed0d50c3Schristos 
381ed0d50c3Schristos   return 0;
382ed0d50c3Schristos }
383ed0d50c3Schristos 
384ed0d50c3Schristos struct bfd_elf_version_expr *
ldemul_new_vers_pattern(struct bfd_elf_version_expr * entry)385ed0d50c3Schristos ldemul_new_vers_pattern (struct bfd_elf_version_expr *entry)
386ed0d50c3Schristos {
387ed0d50c3Schristos   if (ld_emulation->new_vers_pattern)
388ed0d50c3Schristos     entry = (*ld_emulation->new_vers_pattern) (entry);
389ed0d50c3Schristos   return entry;
390ed0d50c3Schristos }
391ed0d50c3Schristos 
392ed0d50c3Schristos void
ldemul_extra_map_file_text(bfd * abfd,struct bfd_link_info * info,FILE * mapf)393ed0d50c3Schristos ldemul_extra_map_file_text (bfd *abfd, struct bfd_link_info *info, FILE *mapf)
394ed0d50c3Schristos {
395ed0d50c3Schristos   if (ld_emulation->extra_map_file_text)
396ed0d50c3Schristos     ld_emulation->extra_map_file_text (abfd, info, mapf);
397ed0d50c3Schristos }
398*b88e3e88Schristos 
399*b88e3e88Schristos int
ldemul_emit_ctf_early(void)400*b88e3e88Schristos ldemul_emit_ctf_early (void)
401*b88e3e88Schristos {
402*b88e3e88Schristos   if (ld_emulation->emit_ctf_early)
403*b88e3e88Schristos     return ld_emulation->emit_ctf_early ();
404*b88e3e88Schristos   /* If the emulation doesn't know if it wants to emit CTF early, it is going
405*b88e3e88Schristos      to do so.  */
406*b88e3e88Schristos   return 1;
407*b88e3e88Schristos }
408*b88e3e88Schristos 
409*b88e3e88Schristos void
ldemul_examine_strtab_for_ctf(struct ctf_file * ctf_output,struct elf_sym_strtab * syms,bfd_size_type symcount,struct elf_strtab_hash * symstrtab)410*b88e3e88Schristos ldemul_examine_strtab_for_ctf (struct ctf_file *ctf_output,
411*b88e3e88Schristos 			       struct elf_sym_strtab *syms,
412*b88e3e88Schristos 			       bfd_size_type symcount,
413*b88e3e88Schristos 			       struct elf_strtab_hash *symstrtab)
414*b88e3e88Schristos 
415*b88e3e88Schristos {
416*b88e3e88Schristos   if (ld_emulation->examine_strtab_for_ctf)
417*b88e3e88Schristos     ld_emulation->examine_strtab_for_ctf (ctf_output, syms,
418*b88e3e88Schristos 					  symcount, symstrtab);
419*b88e3e88Schristos }
420