1 /* Definitions of target machine for GNU compiler, for HPs running
2    HPUX using the 64bit runtime model.
3    Copyright (C) 1999-2016 Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 /* We can debug dynamically linked executables on hpux11; we also
22    want dereferencing of a NULL pointer to cause a SEGV.  Do not move
23    the "+Accept TypeMismatch" switch.  We check for it in collect2
24    to determine which init/fini is needed.  */
25 #undef LINK_SPEC
26 #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GNU_LD)
27 #define LINK_SPEC \
28   "%{!shared:%{p:-L/lib/pa20_64/libp -L/usr/lib/pa20_64/libp %{!static:\
29      %nwarning: consider linking with '-static' as system libraries with\n\
30      %n  profiling support are only provided in archive format}}}\
31    %{!shared:%{pg:-L/lib/pa20_64/libp -L/usr/lib/pa20_64/libp %{!static:\
32      %nwarning: consider linking with '-static' as system libraries with\n\
33      %n  profiling support are only provided in archive format}}}\
34    %{!shared:%{!static:%{rdynamic:-E}}}\
35    %{mhp-ld:+Accept TypeMismatch -z} %{mlinker-opt:-O}\
36    %{!shared:-u main %{!nostdlib:%{!nodefaultlibs:-u __cxa_finalize}}}\
37    %{static:-a archive} %{shared:%{mhp-ld:-b}%{!mhp-ld:-shared}}"
38 #else
39 #define LINK_SPEC \
40   "%{!shared:%{p:-L/lib/pa20_64/libp -L/usr/lib/pa20_64/libp %{!static:\
41      %nwarning: consider linking with '-static' as system libraries with\n\
42      %n  profiling support are only provided in archive format}}}\
43    %{!shared:%{pg:-L/lib/pa20_64/libp -L/usr/lib/pa20_64/libp %{!static:\
44      %nwarning: consider linking with '-static' as system libraries with\n\
45      %n  profiling support are only provided in archive format}}}\
46    %{!shared:%{!static:%{rdynamic:-E}}}\
47    %{!mgnu-ld:+Accept TypeMismatch -z} %{mlinker-opt:-O}\
48    %{!shared:-u main %{!nostdlib:%{!nodefaultlibs:-u __cxa_finalize}}}\
49    %{static:-a archive} %{shared:%{mgnu-ld:-shared}%{!mgnu-ld:-b}}"
50 #endif
51 
52 /* Profiling support is only provided in libc.a.  However, libprof and
53    libgprof are only available in shared form on HP-UX 11.00.  We use
54    the shared form if we are using the GNU linker or an archive form
55    isn't available.  We also usually need to link with libdld and it's
56    only available in shared form.  */
57 #undef LIB_SPEC
58 #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GNU_LD)
59 #define LIB_SPEC \
60   "%{!shared:\
61      %{!p:%{!pg:%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
62                   %{static:-a shared} -lrt %{static:-a archive}}\
63 	    %{mt|pthread:-lpthread} -lc\
64 	    %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\
65 		%{!mt:%{!pthread:-a shared -lc -a archive}}}}}\
66      %{p:%{!pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\
67 	   -lprof %{static:-a archive}\
68 	   %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
69              %{static:-a shared} -lrt %{static:-a archive}}\
70 	   %{mt|pthread:-lpthread} -lc\
71 	   %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\
72 		%{!mt:%{!pthread:-a shared -lc -a archive}}}}}\
73      %{pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\
74        -lgprof %{static:-a archive}\
75        %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
76          %{static:-a shared} -lrt %{static:-a archive}}\
77        %{mt|pthread:-lpthread} -lc\
78        %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\
79 		%{!mt:%{!pthread:-a shared -lc -a archive}}}}}\
80    %{shared:%{mt|pthread:-lpthread}}"
81 #else
82 #define LIB_SPEC \
83   "%{!shared:\
84      %{!p:%{!pg:%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
85                   %{static:-a shared} -lrt %{static:-a archive}}\
86 	    %{mt|pthread:-lpthread} -lc\
87 	    %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\
88 		%{!mt:%{!pthread:-a shared -lc -a archive}}}}}\
89      %{p:%{!pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\
90 	   -lprof %{static:-a archive}\
91 	   %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
92              %{static:-a shared} -lrt %{static:-a archive}}\
93 	   %{mt|pthread:-lpthread} -lc\
94 	   %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\
95 		%{!mt:%{!pthread:-a shared -lc -a archive}}}}}\
96      %{pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\
97        -lgprof %{static:-a archive}\
98        %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
99          %{static:-a shared} -lrt %{static:-a archive}}\
100        %{mt|pthread:-lpthread} -lc\
101        %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\
102 		%{!mt:%{!pthread:-a shared -lc -a archive}}}}}\
103    %{shared:%{mt|pthread:-lpthread}}"
104 #endif
105 
106 /* The libgcc_stub.a and milli.a libraries need to come last.  */
107 #undef LINK_GCC_C_SEQUENCE_SPEC
108 #define LINK_GCC_C_SEQUENCE_SPEC "\
109   %G %L %G %{!nostdlib:%{!nodefaultlibs:%{!shared:-lgcc_stub}\
110   milli.a%s}}"
111 
112 /* Under hpux11, the normal location of the `ld' and `as' programs is the
113    /usr/ccs/bin directory.  */
114 
115 #ifndef CROSS_DIRECTORY_STRUCTURE
116 #undef MD_EXEC_PREFIX
117 #define MD_EXEC_PREFIX "/usr/ccs/bin"
118 #endif
119 
120 /* Default prefixes.  */
121 
122 #undef STANDARD_STARTFILE_PREFIX_1
123 #define STANDARD_STARTFILE_PREFIX_1 "/lib/pa20_64/"
124 
125 #undef STANDARD_STARTFILE_PREFIX_2
126 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/pa20_64/"
127 
128 /* Under hpux11 the normal location of the various pa20_64 *crt*.o files
129    is the /usr/ccs/lib/pa20_64 directory.  Some files may also be in the
130    /opt/langtools/lib/pa20_64 directory.  */
131 
132 #ifndef CROSS_DIRECTORY_STRUCTURE
133 #undef MD_STARTFILE_PREFIX
134 #define MD_STARTFILE_PREFIX "/usr/ccs/lib/pa20_64/"
135 #endif
136 
137 #ifndef CROSS_DIRECTORY_STRUCTURE
138 #undef MD_STARTFILE_PREFIX_1
139 #define MD_STARTFILE_PREFIX_1 "/opt/langtools/lib/pa20_64/"
140 #endif
141 
142 /* This macro specifies the biggest alignment supported by the object
143    file format of this machine.
144 
145    The .align directive in the HP assembler allows alignments up to
146    4096 bytes.  However, the maximum alignment of a global common symbol
147    is 16 bytes using HP ld.  Unfortunately, this macro doesn't provide
148    a method to check for common symbols.  */
149 #undef MAX_OFILE_ALIGNMENT
150 #define MAX_OFILE_ALIGNMENT 32768
151 
152 /* Due to limitations in the target structure, it isn't currently possible
153    to dynamically switch between the GNU and HP assemblers.  */
154 #undef TARGET_GAS
155 
156 /* Configure selects the standard ELFOS defines for use with GAS.  */
157 #ifdef USING_ELFOS_H
158 
159 /* We are using GAS.  */
160 #define TARGET_GAS 1
161 
162 #undef TARGET_ASM_FILE_START
163 #define TARGET_ASM_FILE_START pa_hpux64_gas_file_start
164 
165 /* This is how we output a null terminated string.  */
166 #undef STRING_ASM_OP
167 #define STRING_ASM_OP	"\t.stringz\t"
168 
169 #define TEXT_SECTION_ASM_OP	"\t.text"
170 #define DATA_SECTION_ASM_OP	"\t.data"
171 #define BSS_SECTION_ASM_OP	"\t.section\t.bss"
172 
173 #define JCR_SECTION_NAME	".jcr"
174 
175 #define HP_INIT_ARRAY_SECTION_ASM_OP	"\t.section\t.init"
176 #define GNU_INIT_ARRAY_SECTION_ASM_OP	"\t.section\t.init_array"
177 #define HP_FINI_ARRAY_SECTION_ASM_OP	"\t.section\t.fini"
178 #define GNU_FINI_ARRAY_SECTION_ASM_OP	"\t.section\t.fini_array"
179 
180 /* We need to override the following two macros defined in elfos.h since
181    the .comm directive has a different syntax and it can't be used for
182    local common symbols.  */
183 #undef ASM_OUTPUT_ALIGNED_COMMON
184 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
185   pa_asm_output_aligned_common (FILE, NAME, SIZE, ALIGN)
186 
187 #undef ASM_OUTPUT_ALIGNED_LOCAL
188 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
189   pa_asm_output_aligned_local (FILE, NAME, SIZE, ALIGN)
190 
191 /* The define in pa.h doesn't work with the alias attribute.  The
192    default is ok with the following define for GLOBAL_ASM_OP.  */
193 #undef TARGET_ASM_GLOBALIZE_LABEL
194 
195 /* This is how we globalize a label.  */
196 #define GLOBAL_ASM_OP	"\t.globl\t"
197 
198 /* Hacked version from defaults.h that uses assemble_name_raw
199    instead of assemble_name.  A symbol in a type directive that
200    isn't otherwise referenced doesn't cause the symbol to be
201    placed in the symbol table of the assembled object.  */
202 #undef ASM_OUTPUT_TYPE_DIRECTIVE
203 #define ASM_OUTPUT_TYPE_DIRECTIVE(STREAM, NAME, TYPE)		\
204 do {								\
205   fputs (TYPE_ASM_OP, STREAM);					\
206   assemble_name_raw (STREAM, NAME);				\
207   fputs (", ", STREAM);						\
208   fprintf (STREAM, TYPE_OPERAND_FMT, TYPE);			\
209   putc ('\n', STREAM);						\
210 } while (0)
211 
212 /* Hacked version from elfos.h that doesn't output a label.  */
213 #undef ASM_DECLARE_FUNCTION_NAME
214 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)		\
215 do {								\
216   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");		\
217   ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));		\
218 } while (0)
219 
220 /* The type of external references must be set correctly for the
221    dynamic loader to work correctly.  This is equivalent to the
222    HP assembler's .IMPORT directive but relates more directly to
223    ELF object file types.  */
224 #undef ASM_OUTPUT_EXTERNAL
225 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME)			\
226   pa_hpux_asm_output_external ((FILE), (DECL), (NAME))
227 #define ASM_OUTPUT_EXTERNAL_REAL(FILE, DECL, NAME)		\
228 do {								\
229   if (FUNCTION_NAME_P (NAME))					\
230     ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");		\
231   else								\
232     ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");		\
233   default_elf_asm_output_external (FILE, DECL, NAME);		\
234 } while (0)
235 
236 /* We need set the type for external libcalls.  Also note that not all
237    libcall names are passed to targetm.encode_section_info (e.g., __main).
238    Thus, we also have to do the section encoding if it hasn't been done
239    already.  */
240 #undef ASM_OUTPUT_EXTERNAL_LIBCALL
241 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)			\
242 do {								\
243   if (!FUNCTION_NAME_P (XSTR (FUN, 0)))				\
244     pa_encode_label (FUN);					\
245   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, XSTR (FUN, 0), "function");	\
246 } while (0)
247 
248 /* We need to use the HP style for internal labels.  */
249 #undef ASM_GENERATE_INTERNAL_LABEL
250 #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)		\
251   do								\
252     {								\
253       char *__p;						\
254       (LABEL)[0] = '*';						\
255       (LABEL)[1] = (PREFIX)[0];					\
256       (LABEL)[2] = '$';						\
257       __p = stpcpy (&(LABEL)[3], &(PREFIX)[1]);			\
258       sprint_ul (__p, (unsigned long) (NUM));			\
259     }								\
260   while (0)
261 
262 
263 #else /* USING_ELFOS_H */
264 
265 /* We are not using GAS.  */
266 #define TARGET_GAS 0
267 
268 /* HPUX 11 has the "new" HP assembler.  It's still lousy, but it's a whole
269    lot better than the assembler shipped with older versions of hpux.
270    However, it doesn't support weak symbols and is a bad fit with ELF.  */
271 #undef NEW_HP_ASSEMBLER
272 #define NEW_HP_ASSEMBLER 1
273 
274 /* It looks like DWARF2 will be the easiest debug format to handle on this
275    platform.  */
276 #define DWARF2_DEBUGGING_INFO 1
277 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
278 
279 /* This target uses the ELF object file format.  */
280 #define OBJECT_FORMAT_ELF
281 
282 #undef TARGET_ASM_FILE_START
283 #define TARGET_ASM_FILE_START pa_hpux64_hpas_file_start
284 
285 #undef TEXT_SECTION_ASM_OP
286 #define TEXT_SECTION_ASM_OP		"\t.SUBSPA $CODE$\n"
287 #undef READONLY_DATA_SECTION_ASM_OP
288 #define READONLY_DATA_SECTION_ASM_OP	"\t.SUBSPA $LIT$\n"
289 #undef DATA_SECTION_ASM_OP
290 #define DATA_SECTION_ASM_OP		"\t.SUBSPA $DATA$\n"
291 #undef BSS_SECTION_ASM_OP
292 #define BSS_SECTION_ASM_OP		"\t.SUBSPA $BSS$\n"
293 
294 /* We provide explicit defines for CTORS_SECTION_ASM_OP and
295    DTORS_SECTION_ASM_OP since we don't yet have support for
296    named sections with the HP assembler.  */
297 #undef CTORS_SECTION_ASM_OP
298 #define CTORS_SECTION_ASM_OP "\t.SUBSPA \\.ctors,QUAD=1,ALIGN=8,ACCESS=31"
299 #undef DTORS_SECTION_ASM_OP
300 #define DTORS_SECTION_ASM_OP "\t.SUBSPA \\.dtors,QUAD=1,ALIGN=8,ACCESS=31"
301 
302 #define HP_INIT_ARRAY_SECTION_ASM_OP \
303   "\t.SUBSPA \\.init,QUAD=1,ALIGN=8,ACCESS=31"
304 #define GNU_INIT_ARRAY_SECTION_ASM_OP \
305   "\t.SUBSPA \\.init_array,QUAD=1,ALIGN=8,ACCESS=31"
306 #define HP_FINI_ARRAY_SECTION_ASM_OP \
307   "\t.SUBSPA \\.fini,QUAD=1,ALIGN=8,ACCESS=31"
308 #define GNU_FINI_ARRAY_SECTION_ASM_OP \
309   "\t.SUBSPA \\.fini_array,QUAD=1,ALIGN=8,ACCESS=31"
310 
311 #endif /* USING_ELFOS_H */
312 
313 /* The following defines, used to run constructors and destructors with
314    the SOM linker under HP-UX 11, are not needed.  */
315 #undef HAS_INIT_SECTION
316 #undef LD_INIT_SWITCH
317 #undef LD_FINI_SWITCH
318 
319 /* The following STARTFILE_SPEC and ENDFILE_SPEC defines provide the
320    magic needed to run initializers and finalizers.  */
321 #undef STARTFILE_SPEC
322 #if TARGET_HPUX_11_31
323 #define STARTFILE_SPEC \
324   "%{!shared: %{!symbolic: crt0%O%s} \
325      %{munix=95:unix95.o%s} %{munix=98:unix98.o%s} \
326      %{!munix=93:%{!munix=95:%{!munix=98:unix2003%O%s}}}} \
327      %{static:crtbeginT%O%s} \
328    %{!static:%{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}}"
329 #elif TARGET_HPUX_11_11
330 #define STARTFILE_SPEC \
331   "%{!shared: %{!symbolic: crt0%O%s} %{munix=95:unix95.o%s} \
332      %{!munix=93:%{!munix=95:unix98%O%s}}} %{static:crtbeginT%O%s} \
333    %{!static:%{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}}"
334 #else
335 #define STARTFILE_SPEC \
336   "%{!shared: %{!symbolic: crt0%O%s} %{munix=95:unix95%O%s}} \
337    %{static:crtbeginT%O%s} %{!static:%{!shared:crtbegin%O%s} \
338    %{shared:crtbeginS%O%s}}"
339 #endif
340 #undef ENDFILE_SPEC
341 #define ENDFILE_SPEC "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
342 
343 /* Since HP uses the .init and .fini sections for array initializers
344    and finalizers, we need different defines for INIT_SECTION_ASM_OP
345    and FINI_SECTION_ASM_OP.  With the implementation adopted below,
346    the sections are not actually used.  However, we still must provide
347    defines to select the proper code path.  */
348 #undef INIT_SECTION_ASM_OP
349 #define INIT_SECTION_ASM_OP ""
350 #undef FINI_SECTION_ASM_OP
351 #define FINI_SECTION_ASM_OP
352 
353 /* We are using array initializers and don't want calls in the INIT
354    and FINI sections.  */
355 #undef CRT_CALL_STATIC_FUNCTION
356 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)
357 
358 /* The init_priority attribute is not supported with HP ld.  This could be
359    supported if collect2 was used with LD_INIT_SWITCH.  Unfortunately, this
360    approach doesn't work with GNU ld since HP-UX doesn't support DT_INIT,
361    and therefore the -init and -fini GNU ld switches.  */
362 #undef SUPPORTS_INIT_PRIORITY
363 #define SUPPORTS_INIT_PRIORITY (TARGET_GNU_LD ? 1 : 0)
364 
365 /* We use DTOR_LIST_BEGIN to carry a bunch of hacks to allow us to use
366    the init and fini array sections with both the HP and GNU linkers.
367    The linkers setup the required dynamic entries in the dynamic segment
368    and the dynamic linker does the calls.  This approach avoids using
369    collect2.
370 
371    The first hack is to implement __do_global_ctors_aux in crtbegin as
372    it needs to be the first entry in the init array so that it is called
373    last.  HP got the order of the init array backwards.  The DT_INIT_ARRAY
374    is supposed to be executed in the same order as the addresses appear in
375    the array.  DT_FINI_ARRAY is supposed to be executed in the opposite
376    order.
377 
378    The second hack is a set of plabels to implement the effect of
379    CRT_CALL_STATIC_FUNCTION.  HP-UX 11 only supports DI_INIT_ARRAY and
380    DT_FINI_ARRAY and they put the arrays in .init and .fini, rather than
381    in .init_array and .fini_array.  The standard defines for .init and
382    .fini have the execute flag set.  So, the assembler has to be hacked
383    to munge the standard flags for these sections to make them agree
384    with what the HP linker expects.  With the GNU linker, we need to
385    used the .init_array and .fini_array sections.  So, we set up for
386    both just in case.  Once we have built the table, the linker does
387    the rest of the work.
388 
389    The order is significant.  Placing __do_global_ctors_aux first in
390    the list, results in it being called last.  User specified initializers,
391    either using the linker +init command or a plabel, run before the
392    initializers specified here.  */
393 
394 /* We need to add frame_dummy to the initializer list if EH_FRAME_SECTION_NAME
395    or JCR_SECTION_NAME is defined.  */
396 #if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
397 #define PA_INIT_FRAME_DUMMY_ASM_OP ".dword P%frame_dummy"
398 #else
399 #define PA_INIT_FRAME_DUMMY_ASM_OP ""
400 #endif
401 
402 /* The following hack sets up the .init, .init_array, .fini and
403    .fini_array sections.  */
404 #define PA_CRTBEGIN_HACK \
405 asm (TEXT_SECTION_ASM_OP);						\
406 static void __attribute__((used))					\
407 __do_global_ctors_aux (void)						\
408 {									\
409   func_ptr *p = __CTOR_LIST__;						\
410   while (*(p + 1))							\
411     p++;								\
412   for (; *p != (func_ptr) -1; p--)					\
413     (*p) ();								\
414 }									\
415 									\
416 asm (HP_INIT_ARRAY_SECTION_ASM_OP);					\
417 asm (".align 8");							\
418 asm (".dword P%__do_global_ctors_aux");					\
419 asm (PA_INIT_FRAME_DUMMY_ASM_OP);					\
420 asm (GNU_INIT_ARRAY_SECTION_ASM_OP);					\
421 asm (".align 8");							\
422 asm (".dword P%__do_global_ctors_aux");					\
423 asm (PA_INIT_FRAME_DUMMY_ASM_OP);					\
424 asm (HP_FINI_ARRAY_SECTION_ASM_OP);					\
425 asm (".align 8");							\
426 asm (".dword P%__do_global_dtors_aux");					\
427 asm (GNU_FINI_ARRAY_SECTION_ASM_OP);					\
428 asm (".align 8");							\
429 asm (".dword P%__do_global_dtors_aux")
430 
431 /* The following two variants of DTOR_LIST_BEGIN are identical to those
432    in crtstuff.c except for the addition of the above crtbegin hack.  */
433 #ifdef DTORS_SECTION_ASM_OP
434 #define DTOR_LIST_BEGIN \
435 asm (DTORS_SECTION_ASM_OP);						\
436 STATIC func_ptr __DTOR_LIST__[1]					\
437   __attribute__ ((aligned(sizeof(func_ptr))))				\
438   = { (func_ptr) (-1) };						\
439 PA_CRTBEGIN_HACK
440 #else
441 #define DTOR_LIST_BEGIN \
442 STATIC func_ptr __DTOR_LIST__[1]					\
443   __attribute__ ((section(".dtors"), aligned(sizeof(func_ptr))))	\
444   = { (func_ptr) (-1) };						\
445 PA_CRTBEGIN_HACK
446 #endif
447 
448 /* If using HP ld do not call pxdb.  Use size as a program that does nothing
449    and returns 0.  /bin/true cannot be used because it is a script without
450    an interpreter.  */
451 #define INIT_ENVIRONMENT "LD_PXDB=/usr/ccs/bin/size"
452 
453 /* The HPUX dynamic linker objects to undefined weak symbols, so do
454    not use them in gthr-posix.h.  */
455 #define GTHREAD_USE_WEAK 0
456 
457 /* We don't want undefined weak references to __register_frame_info,
458    __deregister_frame_info, _Jv_RegisterClasses and __cxa_finalize
459    introduced by crtbegin.o.  The GNU linker only resolves weak
460    references if they appear in a shared library.  Thus, it would be
461    impossible to create a static executable if the symbols were weak.
462    So, the best solution seems to be to make the symbols strong and
463    provide an archive library of empty stub functions.  */
464 #define TARGET_ATTRIBUTE_WEAK
465