1 /* bfd back-end for HP PA-RISC SOM objects.
2 Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
4 Contributed by the Center for Software Science at the
5 University of Utah (pa-gdb-bugs@cs.utah.edu).
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
26 #if defined (HOST_HPPAHPUX) || defined (HOST_HPPABSD)
32 #include <sys/types.h>
33 #include <sys/param.h>
36 #include <machine/reg.h>
37 #include <sys/user.h> /* After a.out.h */
41 /* Magic not defined in standard HP-UX header files until 8.0 */
43 #ifndef CPU_PA_RISC1_0
44 #define CPU_PA_RISC1_0 0x20B
45 #endif /* CPU_PA_RISC1_0 */
47 #ifndef CPU_PA_RISC1_1
48 #define CPU_PA_RISC1_1 0x210
49 #endif /* CPU_PA_RISC1_1 */
51 #ifndef _PA_RISC1_0_ID
52 #define _PA_RISC1_0_ID CPU_PA_RISC1_0
53 #endif /* _PA_RISC1_0_ID */
55 #ifndef _PA_RISC1_1_ID
56 #define _PA_RISC1_1_ID CPU_PA_RISC1_1
57 #endif /* _PA_RISC1_1_ID */
59 #ifndef _PA_RISC_MAXID
60 #define _PA_RISC_MAXID 0x2FF
61 #endif /* _PA_RISC_MAXID */
64 #define _PA_RISC_ID(__m_num) \
65 (((__m_num) == _PA_RISC1_0_ID) || \
66 ((__m_num) >= _PA_RISC1_1_ID && (__m_num) <= _PA_RISC_MAXID))
67 #endif /* _PA_RISC_ID */
71 struct som_exec_auxhdr e
;
75 hppa_object_setup (abfd
, file_hdrp
, aux_hdrp
)
77 struct header
*file_hdrp
;
78 struct som_exec_auxhdr
*aux_hdrp
;
80 struct container
*rawptr
;
82 struct hppa_data_struct
*rawptr1
;
83 asection
*text
, *data
, *bss
;
85 rawptr
= (struct container
*) bfd_zalloc (abfd
, sizeof (struct container
));
87 bfd_error
= no_memory
;
91 rawptr1
= (struct hppa_data_struct
*) bfd_zalloc (abfd
, sizeof (struct hppa_data_struct
));
92 if (rawptr1
== NULL
) {
93 bfd_error
= no_memory
;
97 abfd
->tdata
.hppa_data
= rawptr1
;
98 obj_file_hdr (abfd
) = &rawptr
->f
;
99 obj_aux_hdr (abfd
) = &rawptr
->e
;
100 *obj_file_hdr (abfd
) = *file_hdrp
;
101 *obj_aux_hdr (abfd
) = *aux_hdrp
;
103 /* Set the file flags */
104 abfd
->flags
= NO_FLAGS
;
105 if (file_hdrp
->entry_offset
)
106 abfd
->flags
|= HAS_RELOC
;
107 if (file_hdrp
->symbol_total
)
108 abfd
->flags
|= HAS_LINENO
| HAS_DEBUG
| HAS_SYMS
| HAS_LOCALS
;
110 bfd_get_start_address (abfd
) = aux_hdrp
->exec_entry
;
112 obj_pa_symbols (abfd
) = (hppa_symbol_type
*)NULL
;
113 bfd_get_symcount (abfd
) = file_hdrp
->symbol_total
;
115 bfd_default_set_arch_mach(abfd
, bfd_arch_hppa
, 0);
117 /* create the sections. This is raunchy, but bfd_close wants to reclaim
120 text
= bfd_make_section(abfd
, ".text");
121 data
= bfd_make_section(abfd
, ".data");
122 bss
= bfd_make_section(abfd
, ".bss");
124 text
->_raw_size
= aux_hdrp
->exec_tsize
;
125 data
->_raw_size
= aux_hdrp
->exec_dsize
;
126 bss
->_raw_size
= aux_hdrp
->exec_bsize
;
128 text
->flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
);
129 data
->flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
);
130 bss
->flags
= SEC_ALLOC
;
132 /* The virtual memory addresses of the sections */
133 text
->vma
= aux_hdrp
->exec_tmem
;
134 data
->vma
= aux_hdrp
->exec_dmem
;
135 bss
->vma
= aux_hdrp
->exec_bfill
;
137 /* The file offsets of the sections */
138 text
->filepos
= aux_hdrp
->exec_tfile
;
139 data
->filepos
= aux_hdrp
->exec_dfile
;
141 /* The file offsets of the relocation info */
142 text
->rel_filepos
= 0;
143 data
->rel_filepos
= 0;
145 /* The file offsets of the string table and symbol table. */
146 obj_sym_filepos (abfd
) = file_hdrp
->symbol_location
;
147 bfd_get_symcount (abfd
) = file_hdrp
->symbol_total
;
148 obj_str_filepos (abfd
) = file_hdrp
->symbol_strings_location
;
149 obj_stringtab_size (abfd
) = file_hdrp
->symbol_strings_size
;
154 /* Create a new BFD section for NAME. If NAME already exists, then create a
155 new unique name, with NAME as the prefix. This exists because SOM .o files
156 created by the native compiler can have a $CODE$ section for each
161 make_unique_section (abfd
, name
, num
)
170 sect
= bfd_make_section (abfd
, name
);
173 sprintf(altname
, "%s-%d", name
, num
++);
174 sect
= bfd_make_section (abfd
, altname
);
177 newname
= bfd_alloc (abfd
, strlen(sect
->name
) + 1);
178 strcpy (newname
, sect
->name
);
180 sect
->name
= newname
;
184 /* Convert all of the space and subspace info into BFD sections. Each space
185 contains a number of subspaces, which in turn describe the mapping between
186 regions of the exec file, and the address space that the program runs in.
187 BFD sections which correspond to spaces will overlap the sections for the
188 associated subspaces. */
191 setup_sections (abfd
, file_hdr
)
193 struct header
*file_hdr
;
198 /* First, read in space names */
200 space_strings
= alloca (file_hdr
->space_strings_size
);
204 if (bfd_seek (abfd
, file_hdr
->space_strings_location
, SEEK_SET
) < 0)
206 if (bfd_read (space_strings
, 1, file_hdr
->space_strings_size
, abfd
)
207 != file_hdr
->space_strings_size
)
210 /* Loop over all of the space dictionaries, building up sections */
212 for (space_index
= 0; space_index
< file_hdr
->space_total
; space_index
++)
214 struct space_dictionary_record space
;
215 struct subspace_dictionary_record subspace
;
216 int subspace_index
, tmp
;
217 asection
*space_asect
;
219 /* Read the space dictionary element */
220 if (bfd_seek (abfd
, file_hdr
->space_location
221 + space_index
* sizeof space
, SEEK_SET
) < 0)
223 if (bfd_read (&space
, 1, sizeof space
, abfd
) != sizeof space
)
226 /* Setup the space name string */
227 space
.name
.n_name
= space
.name
.n_strx
+ space_strings
;
229 /* Make a section out of it */
230 space_asect
= make_unique_section (abfd
, space
.name
.n_name
, space_index
);
234 /* Now, read in the first subspace for this space */
235 if (bfd_seek (abfd
, file_hdr
->subspace_location
236 + space
.subspace_index
* sizeof subspace
,
239 if (bfd_read (&subspace
, 1, sizeof subspace
, abfd
) != sizeof subspace
)
241 /* Seek back to the start of the subspaces for loop below */
242 if (bfd_seek (abfd
, file_hdr
->subspace_location
243 + space
.subspace_index
* sizeof subspace
,
247 /* Setup the section flags as appropriate (this is somewhat bogus, as
248 there isn't a clear mapping between what's in the space record, and
249 what BFD can describe here). */
250 if (space
.is_loadable
)
251 space_asect
->flags
|= SEC_ALLOC
;
252 if (space
.is_defined
)
253 space_asect
->flags
|= SEC_LOAD
;
255 /* Setup the start address and file loc from the first subspace record */
256 space_asect
->vma
= subspace
.subspace_start
;
257 space_asect
->filepos
= subspace
.file_loc_init_value
;
258 space_asect
->alignment_power
= subspace
.alignment
;
260 /* Loop over the rest of the subspaces, building up more sections */
261 for (subspace_index
= 0; subspace_index
< space
.subspace_quantity
;
264 asection
*subspace_asect
;
266 /* Read in the next subspace */
267 if (bfd_read (&subspace
, 1, sizeof subspace
, abfd
)
271 /* Setup the subspace name string */
272 subspace
.name
.n_name
= subspace
.name
.n_strx
+ space_strings
;
274 /* Make a section out of this subspace */
275 subspace_asect
= make_unique_section (abfd
, subspace
.name
.n_name
,
276 space
.subspace_index
+ subspace_index
);
281 if (subspace
.is_loadable
)
282 subspace_asect
->flags
|= SEC_ALLOC
| SEC_LOAD
;
283 if (subspace
.code_only
)
284 subspace_asect
->flags
|= SEC_CODE
;
286 subspace_asect
->vma
= subspace
.subspace_start
;
287 subspace_asect
->_cooked_size
= subspace
.subspace_length
;
288 subspace_asect
->_raw_size
= subspace
.initialization_length
;
289 subspace_asect
->alignment_power
= subspace
.alignment
;
290 subspace_asect
->filepos
= subspace
.file_loc_init_value
;
293 /* Setup the sizes for the space section based upon the info in the
294 last subspace of the space. */
295 space_asect
->_cooked_size
= (subspace
.subspace_start
- space_asect
->vma
)
296 + subspace
.subspace_length
;
297 space_asect
->_raw_size
= (subspace
.file_loc_init_value
298 - space_asect
->filepos
)
299 + subspace
.initialization_length
;
307 struct header file_hdr
;
308 struct som_exec_auxhdr aux_hdr
;
310 if (bfd_read ((PTR
) &file_hdr
, 1, FILE_HDR_SIZE
, abfd
) != FILE_HDR_SIZE
)
313 if (!_PA_RISC_ID (file_hdr
.system_id
))
315 bfd_error
= wrong_format
;
319 switch (file_hdr
.a_magic
)
321 case RELOC_MAGIC
: /* I'm not really sure about all of these types... */
333 bfd_error
= wrong_format
;
337 if (file_hdr
.version_id
!= VERSION_ID
338 && file_hdr
.version_id
!= NEW_VERSION_ID
)
340 bfd_error
= wrong_format
;
344 if (bfd_read ((PTR
) &aux_hdr
, 1, AUX_HDR_SIZE
, abfd
) != AUX_HDR_SIZE
)
345 bfd_error
= wrong_format
;
347 if (!setup_sections (abfd
, &file_hdr
))
350 return hppa_object_setup(abfd
, &file_hdr
, &aux_hdr
);
354 DEFUN(hppa_mkobject
,(abfd
),
357 fprintf (stderr
, "hppa_mkobject unimplemented\n");
364 DEFUN(hppa_write_object_contents
,(abfd
),
367 fprintf (stderr
, "hppa_write_object_contents unimplemented\n");
374 hppa_get_symtab_upper_bound (abfd
)
377 fprintf (stderr
, "hppa_get_symtab_upper_bound unimplemented\n");
384 hppa_get_reloc_upper_bound (abfd
, asect
)
388 fprintf (stderr
, "hppa_get_reloc_upper_bound unimplemented\n");
395 hppa_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
401 fprintf (stderr
, "hppa_canonicalize_reloc unimplemented\n");
406 extern bfd_target hppa_vec
;
409 hppa_get_symtab (abfd
, location
)
413 fprintf (stderr
, "hppa_get_symtab unimplemented\n");
420 hppa_make_empty_symbol (abfd
)
423 hppa_symbol_type
*new =
424 (hppa_symbol_type
*)bfd_zalloc (abfd
, sizeof (hppa_symbol_type
));
425 new->symbol
.the_bfd
= abfd
;
431 hppa_print_symbol (ignore_abfd
, afile
, symbol
, how
)
435 bfd_print_symbol_type how
;
437 fprintf (stderr
, "hppa_print_symbol unimplemented\n");
443 hppa_new_section_hook (abfd
, newsect
)
447 newsect
->alignment_power
= 3;
449 /* We allow more than three sections internally */
454 hppa_set_section_contents (abfd
, section
, location
, offset
, count
)
461 fprintf (stderr
, "hppa_set_section_contents unimplimented\n");
468 hppa_set_arch_mach (abfd
, arch
, machine
)
470 enum bfd_architecture arch
;
471 unsigned long machine
;
473 fprintf (stderr
, "hppa_set_arch_mach unimplemented\n");
475 /* Allow any architecture to be supported by the hppa backend */
476 return bfd_default_set_arch_mach(abfd
, arch
, machine
);
480 hppa_find_nearest_line (abfd
, section
, symbols
, offset
, filename_ptr
,
481 functionname_ptr
, line_ptr
)
486 CONST
char **filename_ptr
;
487 CONST
char **functionname_ptr
;
488 unsigned int *line_ptr
;
490 fprintf (stderr
, "hppa_find_nearest_line unimplemented\n");
497 hppa_sizeof_headers (abfd
, reloc
)
501 fprintf (stderr
, "hppa_sizeof_headers unimplemented\n");
508 make_bfd_asection (abfd
, name
, flags
, _raw_size
, vma
, alignment_power
)
512 bfd_size_type _raw_size
;
514 unsigned int alignment_power
;
518 asect
= bfd_make_section (abfd
, name
);
522 asect
->flags
= flags
;
523 asect
->_raw_size
= _raw_size
;
525 asect
->filepos
= bfd_tell (abfd
);
526 asect
->alignment_power
= alignment_power
;
533 hppa_core_file_p (abfd
)
536 core_hdr (abfd
) = bfd_zalloc (abfd
, sizeof (struct hppa_core_struct
));
537 if (!core_hdr (abfd
))
543 struct corehead core_header
;
545 val
= bfd_read ((void *)&core_header
, 1, sizeof core_header
, abfd
);
548 switch (core_header
.type
)
552 bfd_seek (abfd
, core_header
.len
, SEEK_CUR
); /* Just skip this */
556 struct proc_exec proc_exec
;
557 bfd_read ((void *)&proc_exec
, 1, core_header
.len
, abfd
);
558 strncpy (core_command (abfd
), proc_exec
.cmd
, MAXCOMLEN
+ 1);
563 struct proc_info proc_info
;
564 core_regsec (abfd
) = make_bfd_asection (abfd
, ".reg",
565 SEC_ALLOC
+SEC_HAS_CONTENTS
,
567 (int)&proc_info
- (int)&proc_info
.hw_regs
,
569 bfd_read (&proc_info
, 1, core_header
.len
, abfd
);
570 core_signal (abfd
) = proc_info
.sig
;
572 if (!core_regsec (abfd
))
576 core_datasec (abfd
) = make_bfd_asection (abfd
, ".data",
577 SEC_ALLOC
+SEC_LOAD
+SEC_HAS_CONTENTS
,
581 if (!core_datasec (abfd
))
583 bfd_seek (abfd
, core_header
.len
, SEEK_CUR
);
586 core_stacksec (abfd
) = make_bfd_asection (abfd
, ".stack",
587 SEC_ALLOC
+SEC_LOAD
+SEC_HAS_CONTENTS
,
591 if (!core_stacksec (abfd
))
593 bfd_seek (abfd
, core_header
.len
, SEEK_CUR
);
596 fprintf (stderr
, "Unknown HPPA/HPUX core file section type %d\n",
598 bfd_seek (abfd
, core_header
.len
, SEEK_CUR
);
603 /* OK, we believe you. You're a core file (sure, sure). */
609 hppa_core_file_failing_command (abfd
)
612 return core_command (abfd
);
617 hppa_core_file_failing_signal (abfd
)
620 return core_signal (abfd
);
625 hppa_core_file_matches_executable_p (core_bfd
, exec_bfd
)
626 bfd
*core_bfd
, *exec_bfd
;
628 return true; /* FIXME, We have no way of telling at this point */
630 #endif /* HOST_HPPAHPUX */
633 /* All the core file code for BSD needs to be rewritten cleanly. For
634 now we do not support core files under BSD. */
636 #define hppa_core_file_p _bfd_dummy_target
637 #define hppa_core_file_failing_command _bfd_dummy_core_file_failing_command
638 #define hppa_core_file_failing_signal _bfd_dummy_core_file_failing_signal
639 #define hppa_core_file_matches_executable_p _bfd_dummy_core_file_matches_executable_p
640 #endif /* HOST_HPPABSD */
642 #define hppa_bfd_debug_info_start bfd_void
643 #define hppa_bfd_debug_info_end bfd_void
644 #define hppa_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
646 #define hppa_openr_next_archived_file bfd_generic_openr_next_archived_file
647 #define hppa_generic_stat_arch_elt bfd_generic_stat_arch_elt
648 #define hppa_slurp_armap bfd_false
649 #define hppa_slurp_extended_name_table _bfd_slurp_extended_name_table
650 #define hppa_truncate_arname (void (*)())bfd_nullvoidptr
651 #define hppa_write_armap 0
653 #define hppa_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
654 #define hppa_close_and_cleanup bfd_generic_close_and_cleanup
655 #define hppa_get_section_contents bfd_generic_get_section_contents
657 #define hppa_bfd_get_relocated_section_contents \
658 bfd_generic_get_relocated_section_contents
659 #define hppa_bfd_relax_section bfd_generic_relax_section
660 #define hppa_bfd_seclet_link bfd_generic_seclet_link
661 #define hppa_bfd_reloc_type_lookup \
662 ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
663 #define hppa_bfd_make_debug_symbol \
664 ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
666 bfd_target hppa_vec
=
669 bfd_target_hppa_flavour
,
670 true, /* target byte order */
671 true, /* target headers byte order */
672 (HAS_RELOC
| EXEC_P
| /* object flags */
673 HAS_LINENO
| HAS_DEBUG
|
674 HAS_SYMS
| HAS_LOCALS
| DYNAMIC
| WP_TEXT
| D_PAGED
),
675 (SEC_CODE
|SEC_DATA
|SEC_ROM
|SEC_HAS_CONTENTS
676 |SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
678 /* leading_symbol_char: is the first char of a user symbol
679 predictable, and if so what is it */
681 ' ', /* ar_pad_char */
682 16, /* ar_max_namelen */
683 3, /* minimum alignment */
684 _do_getb64
, _do_getb_signed_64
, _do_putb64
,
685 _do_getb32
, _do_getb_signed_32
, _do_putb32
,
686 _do_getb16
, _do_getb_signed_16
, _do_putb16
, /* data */
687 _do_getb64
, _do_getb_signed_64
, _do_putb64
,
688 _do_getb32
, _do_getb_signed_32
, _do_putb32
,
689 _do_getb16
, _do_getb_signed_16
, _do_putb16
, /* hdrs */
691 hppa_object_p
, /* bfd_check_format */
692 bfd_generic_archive_p
,
698 _bfd_generic_mkarchive
,
703 hppa_write_object_contents
,
704 _bfd_write_archive_contents
,
712 #endif /* HOST_HPPAHPUX || HOST_HPPABSD */