gas fixes for x86 elf/coff emulations
Robert Lipe
robertl@dgii.com
Wed Jan 8 22:04:00 GMT 1997
As promised, here's the additional work in config/tc-i386.c.
I have now built binutils with gcc and the assembler with yesterday's
patches plus this work. Problems remain with debugging (-gstabs aborts
in COFF, COFF debugging gets tripped up by certain files) but in loose
generalities, things work. Things seem to work quite well in ELF.
I don't know at this time how much of the problems I'm seeing are
artifacts of of the questionable (?) --iwth-bfd-assembler version
of the COFF stuff.
Whitespace may need to be adjusted.
RJL
Wed Jan 8 23:28:34 CST 1997 Robert Lipe <robertl@dgii.com>
* config/tc-i386.c: Several changes to allow emulations
to work for x86 ELF and COFF.
*** gas.orig/config/tc-i386.c Tue Dec 17 03:05:30 1996
--- gas/config/tc-i386.c Wed Jan 8 23:08:22 1997
***************
*** 104,110 ****
/* This array holds the chars that always start a comment. If the
pre-processor is disabled, these aren't very useful */
! #if defined (TE_I386AIX) || defined (OBJ_ELF)
const char comment_chars[] = "#/";
#else
const char comment_chars[] = "#";
--- 104,110 ----
/* This array holds the chars that always start a comment. If the
pre-processor is disabled, these aren't very useful */
! #if defined (TE_I386AIX) || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
const char comment_chars[] = "#/";
#else
const char comment_chars[] = "#";
***************
*** 118,124 ****
#NO_APP at the beginning of its output. */
/* Also note that comments started like this one will always work if
'/' isn't otherwise defined. */
! #if defined (TE_I386AIX) || defined (OBJ_ELF)
const char line_comment_chars[] = "";
#else
const char line_comment_chars[] = "/";
--- 118,124 ----
#NO_APP at the beginning of its output. */
/* Also note that comments started like this one will always work if
'/' isn't otherwise defined. */
! #if defined (TE_I386AIX) || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
const char line_comment_chars[] = "";
#else
const char line_comment_chars[] = "/";
***************
*** 555,564 ****
operand_chars[(unsigned char) *p] = *p;
}
! #ifdef OBJ_ELF
record_alignment (text_section, 2);
record_alignment (data_section, 2);
record_alignment (bss_section, 2);
#endif
}
--- 555,566 ----
operand_chars[(unsigned char) *p] = *p;
}
! #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
! if (OUTPUT_FLAVOR == bfd_target_elf_flavour) {
record_alignment (text_section, 2);
record_alignment (data_section, 2);
record_alignment (bss_section, 2);
+ }
#endif
}
***************
*** 2631,2640 ****
if (fixP->fx_r_type == BFD_RELOC_32_PCREL && fixP->fx_addsy)
{
#ifndef OBJ_AOUT
value += fixP->fx_where + fixP->fx_frag->fr_address;
#endif
! #ifdef OBJ_ELF
! if (S_GET_SEGMENT (fixP->fx_addsy) == seg
|| (fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) != 0)
{
/* Yes, we add the values in twice. This is because
--- 2633,2644 ----
if (fixP->fx_r_type == BFD_RELOC_32_PCREL && fixP->fx_addsy)
{
#ifndef OBJ_AOUT
+ if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
value += fixP->fx_where + fixP->fx_frag->fr_address;
#endif
! #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
! if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
! if (S_GET_SEGMENT (fixP->fx_addsy) == seg
|| (fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) != 0)
{
/* Yes, we add the values in twice. This is because
***************
*** 2648,2655 ****
/* Fix a few things - the dynamic linker expects certain values here,
and we must not dissappoint it. */
! #ifdef OBJ_ELF
! if (fixP->fx_addsy)
switch(fixP->fx_r_type) {
case BFD_RELOC_386_PLT32:
/* Make the jump instruction point to the address of the operand. At
--- 2652,2660 ----
/* Fix a few things - the dynamic linker expects certain values here,
and we must not dissappoint it. */
! #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
! if ( (OUTPUT_FLAVOR == bfd_target_elf_flavour) &&
! fixP->fx_addsy)
switch(fixP->fx_r_type) {
case BFD_RELOC_386_PLT32:
/* Make the jump instruction point to the address of the operand. At
***************
*** 2838,2856 ****
flag_do_long_jump = 1;
break;
! #ifdef OBJ_ELF
/* -k: Ignore for FreeBSD compatibility. */
case 'k':
break;
/* -V: SVR4 argument to print version ID. */
case 'V':
! print_version_id ();
break;
/* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
should be emitted or not. FIXME: Not implemented. */
case 'Q':
break;
#endif
--- 2843,2866 ----
flag_do_long_jump = 1;
break;
! #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
/* -k: Ignore for FreeBSD compatibility. */
case 'k':
+ if (OUTPUT_FLAVOR == bfd_target_elf_flavour) return 1 ;
break;
/* -V: SVR4 argument to print version ID. */
case 'V':
! if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
! print_version_id ();
! else
! return 0 ;
break;
/* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
should be emitted or not. FIXME: Not implemented. */
case 'Q':
+ if (OUTPUT_FLAVOR == bfd_target_elf_flavour) return 1 ;
break;
#endif
***************
*** 3003,3008 ****
--- 3013,3031 ----
return rel;
}
+ const char *
+ i386_target_format()
+ {
+ switch (OUTPUT_FLAVOR) {
+ case bfd_target_coff_flavour:
+ return "coff-i386" ;
+ case bfd_target_elf_flavour:
+ return "elf32-i386" ;
+ default:
+ abort() ;
+ }
+ }
+
#else /* ! BFD_ASSEMBLER */
#if (defined(OBJ_AOUT) | defined(OBJ_BOUT))
More information about the Gas2
mailing list