Browse Source

* coffcode.h (coff_add_missing_symbols): if symbols don't come

from a coff file (csym is null), dont deref them

	* ieee.c (parse_expression): get the answer right when adding an
	abs+(sec+off), (ieee_generic_stat_arch_elt): call ieee_object_p
	on elts so that filename is filled in.
gdb-4_18-branch
Steve Chamberlain 34 years ago
parent
commit
9465d03ed5
  1. 9
      bfd/ChangeLog
  2. 45
      bfd/coffcode.h
  3. 58
      bfd/ieee.c

9
bfd/ChangeLog

@ -1,3 +1,12 @@
Mon Aug 24 12:06:31 1992 Steve Chamberlain (sac@thepub.cygnus.com)
* coffcode.h (coff_add_missing_symbols): if symbols don't come
from a coff file (csym is null), dont deref them
* ieee.c (parse_expression): get the answer right when adding an
abs+(sec+off), (ieee_generic_stat_arch_elt): call ieee_object_p
on elts so that filename is filled in.
Thu Aug 20 19:05:48 1992 Ken Raeburn (raeburn@cygnus.com) Thu Aug 20 19:05:48 1992 Ken Raeburn (raeburn@cygnus.com)
* bout.c (howto_align_table): New set of relocs, with enough * bout.c (howto_align_table): New set of relocs, with enough

45
bfd/coffcode.h

@ -1789,6 +1789,17 @@ DEFUN(coff_write_relocs,(abfd),
struct internal_reloc n; struct internal_reloc n;
arelent *q = p[i]; arelent *q = p[i];
memset((PTR)&n, 0, sizeof(n)); memset((PTR)&n, 0, sizeof(n));
#ifndef SWAP_OUT_RELOC_OFFSET
/* @@FIXME COFF relocs don't support addends. Code should probably be
in the target-independent code, using a target flag to decide whether
to fold the addend into the section contents. */
if (q->addend != 0)
abort ();
#endif
n.r_vaddr = q->address + s->vma; n.r_vaddr = q->address + s->vma;
/* The 29k const/consth reloc pair is a real kludge - the consth /* The 29k const/consth reloc pair is a real kludge - the consth
part doesn't have a symbol - it has an offset. So rebuilt part doesn't have a symbol - it has an offset. So rebuilt
@ -2275,21 +2286,25 @@ coff_add_missing_symbols (abfd)
{ {
coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]); coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
CONST char *name; CONST char *name;
if (csym)
if (csym->native && csym->native->u.syment.n_sclass == C_FILE) {
/* only do this if there is a coff representation of the input
symbol */
if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
{ {
need_file = 0; need_file = 0;
continue; continue;
} }
name = csym->symbol.name; name = csym->symbol.name;
if (!name) if (!name)
continue; continue;
if (!strcmp (name, _TEXT)) if (!strcmp (name, _TEXT))
need_text = 0; need_text = 0;
else if (!strcmp (name, _DATA)) else if (!strcmp (name, _DATA))
need_data = 0; need_data = 0;
else if (!strcmp (name, _BSS)) else if (!strcmp (name, _BSS))
need_bss = 0; need_bss = 0;
}
} }
/* Now i == bfd_get_symcount (abfd). */ /* Now i == bfd_get_symcount (abfd). */
/* @@ For now, don't deal with .file symbol. */ /* @@ For now, don't deal with .file symbol. */
@ -2311,7 +2326,7 @@ coff_add_missing_symbols (abfd)
sympp2[i++] = coff_section_symbol (abfd, _DATA); sympp2[i++] = coff_section_symbol (abfd, _DATA);
if (need_bss) if (need_bss)
sympp2[i++] = coff_section_symbol (abfd, _BSS); sympp2[i++] = coff_section_symbol (abfd, _BSS);
assert (i == nsyms); BFD_ASSERT (i == nsyms);
bfd_set_symtab (abfd, sympp2, nsyms); bfd_set_symtab (abfd, sympp2, nsyms);
} }
#endif /* NO_COFF_SYMBOLS */ #endif /* NO_COFF_SYMBOLS */
@ -3787,7 +3802,7 @@ DEFUN(perform_slip,(s, slip, input_section, value),
/* This was pointing into this section, so mangle it */ /* This was pointing into this section, so mangle it */
if (p->value > value) if (p->value > value)
{ {
p->value -=2; p->value -= slip;
} }
} }
s++; s++;
@ -4027,7 +4042,7 @@ DEFUN(bfd_coff_get_relocated_section_contents,(in_abfd, seclet, data),
*/ */
if (data[dst_address-1] != 0x6a) if (data[dst_address-1] != 0x6a)
abort(); abort();
switch (data[dst_address] & 0xf0) switch (data[src_address] & 0xf0)
{ {
case 0x00: case 0x00:
/* Src is memory */ /* Src is memory */
@ -4072,7 +4087,7 @@ DEFUN(bfd_coff_get_relocated_section_contents,(in_abfd, seclet, data),
case R_RELBYTE: case R_RELBYTE:
{ {
unsigned int gap =get_value(reloc,seclet); unsigned int gap =get_value(reloc,seclet);
if (gap > 256) if (gap > 0xff && gap < ~0xff)
{ {
bfd_error_vector.reloc_value_truncated(reloc, seclet); bfd_error_vector.reloc_value_truncated(reloc, seclet);
} }

58
bfd/ieee.c

@ -1,5 +1,6 @@
/* bfd back-end for ieee-695 objects. /* bfd back-end for ieee-695 objects.
Copyright (C) 1990-1991 Free Software Foundation, Inc. Copyright (C) 1990-1992 Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support. Written by Steve Chamberlain of Cygnus Support.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -18,6 +19,8 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define KEEPMINUSPCININST 1
/* IEEE 695 format is a stream of records, which we parse using a simple one- /* IEEE 695 format is a stream of records, which we parse using a simple one-
token (which is one byte in this lexicon) lookahead recursive decent token (which is one byte in this lexicon) lookahead recursive decent
parser. */ parser. */
@ -28,6 +31,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "ieee.h" #include "ieee.h"
#include "libieee.h" #include "libieee.h"
#include "obstack.h"
#define obstack_chunk_alloc bfd_xmalloc
#define obstack_chunk_free free
/* Functions for writing to ieee files in the strange way that the /* Functions for writing to ieee files in the strange way that the
standard requires. */ standard requires. */
@ -362,26 +370,29 @@ reloc_howto_type abs8_howto
static static
reloc_howto_type rel32_howto reloc_howto_type rel32_howto
= HOWTO(1,0,2,32,true,0,false,true,0,"rel32",true,0xffffffff, 0xffffffff,true); = HOWTO(1,0,2,32,true,0,false,true,0,"rel32",true,0xffffffff,
0xffffffff,false);
static static
reloc_howto_type rel16_howto reloc_howto_type rel16_howto
= HOWTO(1,0,1,16,true,0,false,true,0,"rel16",true,0x0000ffff, 0x0000ffff,true); = HOWTO(1,0,1,16,true,0,false,true,0,"rel16",true,0x0000ffff, 0x0000ffff,false);
static static
reloc_howto_type rel8_howto reloc_howto_type rel8_howto
= HOWTO(1,0,0,8,true,0,false,true,0,"rel8",true,0x000000ff, 0x000000ff,true); = HOWTO(1,0,0,8,true,0,false,true,0,"rel8",true,0x000000ff, 0x000000ff,false);
static ieee_symbol_index_type NOSYMBOL = { 0, 0}; static ieee_symbol_index_type NOSYMBOL = { 0, 0};
static void static void
DEFUN(parse_expression,(ieee, value, symbol, pcrel, extra), DEFUN(parse_expression,(ieee, value, symbol, pcrel, extra, section),
ieee_data_type *ieee AND ieee_data_type *ieee AND
bfd_vma *value AND bfd_vma *value AND
ieee_symbol_index_type *symbol AND ieee_symbol_index_type *symbol AND
boolean *pcrel AND boolean *pcrel AND
unsigned int *extra) unsigned int *extra AND
asection **section)
{ {
#define POS sp[1] #define POS sp[1]
@ -467,7 +478,7 @@ DEFUN(parse_expression,(ieee, value, symbol, pcrel, extra),
POP(sy1, section1, value1); POP(sy1, section1, value1);
POP(sy2, section2, value2); POP(sy2, section2, value2);
PUSH(sy1.letter ? sy1 : sy2, section1 ? section1: section2, value1+value2); PUSH(sy1.letter ? sy1 : sy2, section1!=&bfd_abs_section ? section1: section2, value1+value2);
} }
break; break;
default: default:
@ -497,8 +508,9 @@ DEFUN(parse_expression,(ieee, value, symbol, pcrel, extra),
} }
{ {
asection *dummy; asection *dummy;
POP(*symbol, dummy, *value); POP(*symbol, dummy, *value);
if (section) *section = dummy;
} }
loop = false; loop = false;
@ -639,10 +651,10 @@ DEFUN(ieee_slurp_external_symbols,(abfd),
symbol_name_index = must_parse_int(&(ieee->h)); symbol_name_index = must_parse_int(&(ieee->h));
parse_expression(ieee, parse_expression(ieee,
&symbol->symbol.value, &symbol->symbol.value,
&symbol->symbol.section,
&symbol_ignore, &symbol_ignore,
&pcrel_ignore, &pcrel_ignore,
&extra); &extra,
&symbol->symbol.section);
symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT; symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
@ -981,7 +993,7 @@ DEFUN(ieee_archive_p,(abfd),
unsigned int i; unsigned int i;
uint8e_type buffer[512]; uint8e_type buffer[512];
struct obstack ob;
int buffer_offset = 0; int buffer_offset = 0;
ieee_ar_data_type *save = abfd->tdata.ieee_ar_data; ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
ieee_ar_data_type *ieee ; ieee_ar_data_type *ieee ;
@ -989,6 +1001,7 @@ uint8e_type buffer[512];
ieee= IEEE_AR_DATA(abfd); ieee= IEEE_AR_DATA(abfd);
bfd_read((PTR)buffer, 1, sizeof(buffer), abfd); bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
ieee->h.first_byte = buffer; ieee->h.first_byte = buffer;
@ -1013,6 +1026,10 @@ uint8e_type buffer[512];
free( read_id(&(ieee->h))); free( read_id(&(ieee->h)));
/* This must be an IEEE archive, so we'll buy some space to do /* This must be an IEEE archive, so we'll buy some space to do
things */ things */
obstack_begin(&ob, 128);
ieee->element_count = 0; ieee->element_count = 0;
ieee->element_index = 0; ieee->element_index = 0;
@ -1030,7 +1047,8 @@ uint8e_type buffer[512];
t.file_offset = must_parse_int(&(ieee->h)); t.file_offset = must_parse_int(&(ieee->h));
t.abfd = (bfd *)NULL; t.abfd = (bfd *)NULL;
ieee->element_count++; ieee->element_count++;
bfd_alloc_grow(abfd, (PTR)&t, sizeof(t));
obstack_grow(&ob, (PTR)&t, sizeof(t));
/* Make sure that we don't go over the end of the buffer */ /* Make sure that we don't go over the end of the buffer */
@ -1046,7 +1064,7 @@ uint8e_type buffer[512];
else loop = false; else loop = false;
} }
ieee->elements = (ieee_ar_obstack_type *)bfd_alloc_finish(abfd); ieee->elements = obstack_finish(&ob);
/* Now scan the area again, and replace BB offsets with file */ /* Now scan the area again, and replace BB offsets with file */
/* offsets */ /* offsets */
@ -1095,8 +1113,9 @@ DEFUN(ieee_object_p,(abfd),
ieee_data_type *save = IEEE_DATA(abfd); ieee_data_type *save = IEEE_DATA(abfd);
abfd->tdata.ieee_data = 0; abfd->tdata.ieee_data = 0;
ieee_mkobject(abfd); ieee_mkobject(abfd);
ieee = IEEE_DATA(abfd);
ieee = IEEE_DATA(abfd);
bfd_seek(abfd, 0, 0);
/* Read the first few bytes in to see if it makes sense */ /* Read the first few bytes in to see if it makes sense */
bfd_read((PTR)buffer, 1, sizeof(buffer), abfd); bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
@ -1278,9 +1297,8 @@ asection *section;
parse_expression(ieee, parse_expression(ieee,
&r->relent.addend, &r->relent.addend,
&section,
&r->symbol, &r->symbol,
&pcrel, &extra); &pcrel, &extra, &section);
r->relent.address = current_map->pc; r->relent.address = current_map->pc;
s->reloc_count++; s->reloc_count++;
if (r->relent.sym_ptr_ptr == 0) { if (r->relent.sym_ptr_ptr == 0) {
@ -1468,9 +1486,9 @@ DEFUN(ieee_slurp_section_data,(abfd),
next_byte(&(ieee->h)); next_byte(&(ieee->h));
must_parse_int(&(ieee->h)); /* Thow away section #*/ must_parse_int(&(ieee->h)); /* Thow away section #*/
parse_expression(ieee, &value, parse_expression(ieee, &value,
&dsection,
&symbol, &symbol,
&pcrel, &extra); &pcrel, &extra,
0);
current_map->pc = value; current_map->pc = value;
BFD_ASSERT((unsigned)(value - s->vma) <= s->_raw_size); BFD_ASSERT((unsigned)(value - s->vma) <= s->_raw_size);
} }
@ -2848,7 +2866,7 @@ ieee_generic_stat_arch_elt(abfd, buf)
bfd *abfd; bfd *abfd;
struct stat *buf; struct stat *buf;
{ {
ieee_ar_data_type *ar = IEEE_AR_DATA(abfd); ieee_ar_data_type *ar = abfd->my_archive->tdata.ieee_ar_data;
if (ar == (ieee_ar_data_type *)NULL) { if (ar == (ieee_ar_data_type *)NULL) {
bfd_error = invalid_operation; bfd_error = invalid_operation;
return -1; return -1;
@ -2856,7 +2874,7 @@ struct stat *buf;
else { else {
buf->st_size = 0x1; buf->st_size = 0x1;
buf->st_mode = 0666; buf->st_mode = 0666;
return 0; return ! ieee_object_p(abfd);
} }
} }
static int static int

Loading…
Cancel
Save