{NULL}
};
-/* SOM does not use this. */
-
-void
-obj_read_begin_hook ()
-{
-}
-
/* Handle a .version directive. FIXME. We just parse the .version
directive and throw away the results!. */
obj_som_version (unused)
int unused;
{
- SKIP_WHITESPACE ()
+ SKIP_WHITESPACE ();
if (*input_line_pointer == '\"')
{
++input_line_pointer;
obj_som_init_stab_section (seg)
segT seg;
{
- segT saved_seg = now_seg, space;
+ segT saved_seg = now_seg;
+ segT space;
subsegT saved_subseg = now_subseg;
+ char *p, *file;
+ unsigned int stroff;
/* Make the space which will contain the debug subspaces. */
space = bfd_make_section_old_way (stdoutput, "$GDB_DEBUG$");
/* Set SOM specific attributes for the space. In particular we set
- the space "defined", "private", "sort_key", and "spnum" values. */
- obj_set_section_attributes (space, 1, 1, 255, 2);
+ the space "defined", "private", "sort_key", and "spnum" values.
+
+ Due to a bug in pxdb (called by hpux linker), the sort keys
+ of the various stabs spaces/subspaces need to be "small". We
+ reserve range 72/73 which appear to work well. */
+ obj_set_section_attributes (space, 1, 1, 72, 2);
+ bfd_set_section_alignment (stdoutput, space, 2);
/* Set the containing space for both stab sections to be $GDB_DEBUG$
(just created above). Also set some attributes which BFD does
not understand. In particular, access bits, sort keys, and load
quadrant. */
- obj_set_subsection_attributes (seg, space, 0x1f, 255, 0);
+ obj_set_subsection_attributes (seg, space, 0x1f, 73, 0);
+ bfd_set_section_alignment (stdoutput, seg, 2);
+
+ /* Make some space for the first stab entry which is special.
+ It contains information about the length of this file's
+ stab string and the like. Using it avoids the need to
+ relocate the stab strings.
+
+ The $GDB_STRINGS$ space will be created as a side effect of
+ the call to get_stab_string_offset. */
+ p = frag_more (12);
+ as_where (&file, (unsigned int *) NULL);
+ stroff = get_stab_string_offset (file, "$GDB_STRINGS$");
+ know (stroff == 1);
+ md_number_to_chars (p, stroff, 4);
+ seg_info (seg)->stabu.p = p;
- /* Likewise for the $GDB_STRINGS$ subspace. Note the section
- hasn't been created at the time of this call, so we create
- it now. */
- seg = subseg_new ("$GDB_STRINGS$", 0);
- obj_set_subsection_attributes (seg, space, 0x1f, 254, 0);
+ /* Set the containing space for both stab sections to be $GDB_DEBUG$
+ (just created above). Also set some attributes which BFD does
+ not understand. In particular, access bits, sort keys, and load
+ quadrant. */
+ seg = bfd_get_section_by_name (stdoutput, "$GDB_STRINGS$");
+ obj_set_subsection_attributes (seg, space, 0x1f, 72, 0);
+ bfd_set_section_alignment (stdoutput, seg, 2);
subseg_set (saved_seg, saved_subseg);
}
+
+/* Fill in the counts in the first entry in a .stabs section. */
+
+static void
+adjust_stab_sections (abfd, sec, xxx)
+ bfd *abfd;
+ asection *sec;
+ PTR xxx;
+{
+ asection *strsec;
+ char *p;
+ int strsz, nsyms;
+
+ if (strcmp ("$GDB_SYMBOLS$", sec->name))
+ return;
+
+ strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$");
+ if (strsec)
+ strsz = bfd_section_size (abfd, strsec);
+ else
+ strsz = 0;
+ nsyms = bfd_section_size (abfd, sec) / 12 - 1;
+
+ p = seg_info (sec)->stabu.p;
+ assert (p != 0);
+
+ bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
+ bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
+}
+
+/* Called late in the asssembly phase to adjust the special
+ stab entry. This is where any other late object-file dependent
+ processing which should happen. */
+
+void
+som_frob_file ()
+{
+ bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0);
+}