More Lynx support, plus better stabs-in-coff generation.

This commit is contained in:
Stan Shebs 1993-09-28 19:22:08 +00:00
parent 5573d7d4b1
commit 8f3956b328
4 changed files with 126 additions and 4 deletions

View File

@ -1,3 +1,23 @@
Tue Sep 28 12:02:04 1993 Stan Shebs (shebs@rtl.cygnus.com)
* configure.in: Split i386 LynxOS out from other coff targets,
add a specific Lynx emulation.
Add m68k LynxOS target.
* config/tc-i386.c: Define specific Lynx target format.
* config/tc-m68k.c: Define specific Lynx target format.
* config/te-lynx.h: New file.
* config/obj-coffbfd.h: Don't set TARGET_FORMAT to be
"coff-{i386,m68k}" if TARGET_FORMAT already defined.
(INIT_STAB_SECTION): Define.
* config/obj-coffbfd.c: Include <time.h>.
(write_object_file): Look for .stab sections and call
adjust_stab_section.
(adjust_stab_section): New function, fills in the first symbol
of a stab section with number of symbols and string table size.
(obj_coff_init_stab_section): New function, creates the initial
symbol for a stab section.
Mon Sep 27 15:21:55 1993 Ken Raeburn (raeburn@cambridge.cygnus.com)
* config/atof-vax.c (md_atof): Return null on success instead of

View File

@ -40,6 +40,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "obstack.h"
#include "subsegs.h"
#include "frags.h"
/* This is needed because we include internal bfd things. */
#include <time.h>
#include "../bfd/libbfd.h"
#include "../bfd/libcoff.h"
@ -76,7 +78,6 @@ const short seg_N_TYPE[] =
C_REGISTER_SECTION, /* SEG_REGISTER */
};
int function_lineoff = -1; /* Offset in line#s where the last function
started (the odd entry for line #0) */
@ -1811,6 +1812,7 @@ extern void
DEFUN_VOID (write_object_file)
{
int i;
char *name;
struct frchain *frchain_ptr;
object_headers headers;
@ -1902,6 +1904,18 @@ DEFUN_VOID (write_object_file)
}
#endif
/* Look for ".stab" segments and fill in their initial symbols
correctly. */
for (i = SEG_E0; i < SEG_UNKNOWN; i++)
{
name = segment_info[i].scnhdr.s_name;
if (name != NULL
&& strncmp (".stab", name, 5) == 0
&& strncmp (".stabstr", name, 8) != 0)
adjust_stab_section (abfd, i);
}
file_cursor = H_GET_TEXT_FILE_OFFSET (&headers);
bfd_seek (abfd, (file_ptr) file_cursor, 0);
@ -1943,7 +1957,7 @@ DEFUN_VOID (write_object_file)
}
coff_header_append (abfd, &headers);
if (bfd_close_all_done (abfd) == false)
as_fatal ("Can't close %s: %s", out_file_name,
bfd_errmsg (bfd_error));
@ -2628,3 +2642,76 @@ DEFUN (fixup_segment, (segP, this_segment_type),
} /* fixup_segment() */
#endif
/* The first entry in a .stab section is special. */
void
obj_coff_init_stab_section (seg)
segT seg;
{
extern char *logical_input_file, *physical_input_file;
char *p;
const char *file;
unsigned int stroff;
/* Make space for this first symbol. */
p = frag_more (12);
file = logical_input_file;
if (file == NULL)
file = physical_input_file;
if (file == NULL)
file = "UNKNOWN";
stroff = get_stab_string_offset (file, segment_info[seg].scnhdr.s_name);
know (stroff == 1);
md_number_to_chars (p, stroff, 4);
}
/* Fill in the counts in the first entry in a .stab section. */
adjust_stab_section(abfd, seg)
bfd *abfd;
segT seg;
{
segT stabstrseg = -1;
char *secname, *name, *name2;
asection *stabsec, *stabstrsec;
char *p = NULL;
int i, strsz = 0, nsyms;
fragS *frag = segment_info[seg].frchainP->frch_root;
/* Look for the associated string table section. */
secname = segment_info[seg].scnhdr.s_name;
name = (char *) alloca (strlen (secname) + 4);
strcpy (name, secname);
strcat (name, "str");
for (i = SEG_E0; i < SEG_UNKNOWN; i++)
{
name2 = segment_info[i].scnhdr.s_name;
if (name2 != NULL && strncmp(name2, name, 8) == 0)
{
stabstrseg = i;
break;
}
}
/* If we found the section, get its size. */
if (stabstrseg >= 0)
strsz = size_section (abfd, stabstrseg);
nsyms = size_section (abfd, seg) / 12 - 1;
/* Look for the first frag of sufficient size for the initial stab
symbol, and collect a pointer to it. */
while (frag && frag->fr_fix < 12)
frag = frag->fr_next;
assert (frag != 0);
p = frag->fr_literal;
assert (p != 0);
/* Write in the number of stab symbols and the size of the string
table. */
bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
}

View File

@ -61,8 +61,10 @@
#ifdef TC_M68K
#include "coff/m68k.h"
#ifndef TARGET_FORMAT
#define TARGET_FORMAT "coff-m68k"
#endif
#endif
#ifdef TC_M88K
#include "coff/m88k.h"
@ -71,8 +73,10 @@
#ifdef TC_I386
#include "coff/i386.h"
#ifndef TARGET_FORMAT
#define TARGET_FORMAT "coff-i386"
#endif
#endif
#ifdef TC_A29K
#include "coff/a29k.h"
@ -522,7 +526,6 @@ extern struct internal_scnhdr text_section_header;
extern SCNHDR data_section_header;
extern SCNHDR text_section_header;
#endif
#endif
/* Forward the segment of a forwarded symbol. */
#define obj_frob_forward_symbol(symp) \
@ -530,6 +533,15 @@ extern SCNHDR text_section_header;
? (S_SET_SEGMENT (symp, S_GET_SEGMENT (symp->sy_value.X_add_symbol)), 0) \
: 0)
/* Stabs in a coff file go into their own section. */
#define SEPARATE_STAB_SECTIONS
/* end of obj-coffbfd.h */
/* We need 12 bytes at the start of the section to hold some initial
information. */
extern void obj_coff_init_stab_section PARAMS ((segT));
#define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg)
#endif /* OBJ_FORMAT_H */

3
gas/config/te-lynx.h Normal file
View File

@ -0,0 +1,3 @@
#define TE_LYNX
#include "obj-format.h"