* Patch for PR 18607.

1999-01-26  Frank Ch. Eigler  <fche@cygnus.com>
	* binary.c (binary_set_section_contents): Emit warning for
	huge file offsets due to widely-dispersed section LMAs.
This commit is contained in:
Frank Ch. Eigler
1999-01-26 16:46:13 +00:00
parent b041460dbe
commit 223fff6650
2 changed files with 47 additions and 12 deletions

@ -1,3 +1,8 @@
1999-01-26 Frank Ch. Eigler <fche@cygnus.com>
* binary.c (binary_set_section_contents): Emit warning for
huge file offsets due to widely-dispersed section LMAs.
Mon Jan 18 03:35:35 1999 Ian Lance Taylor <ian@cygnus.com> Mon Jan 18 03:35:35 1999 Ian Lance Taylor <ian@cygnus.com>
* elf.c (assign_file_positions_for_segments): If not D_PAGED, * elf.c (assign_file_positions_for_segments): If not D_PAGED,

@ -1,5 +1,5 @@
/* BFD back-end for binary objects. /* BFD back-end for binary objects.
Copyright 1994 Free Software Foundation, Inc. Copyright 1994, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com> Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -155,7 +155,7 @@ mangle_name (abfd, suffix)
/* Change any non-alphanumeric characters to underscores. */ /* Change any non-alphanumeric characters to underscores. */
for (p = buf; *p; p++) for (p = buf; *p; p++)
if (! isalnum (*p)) if (! isalnum ((unsigned char) *p))
*p = '_'; *p = '_';
return buf; return buf;
@ -229,7 +229,7 @@ binary_get_symbol_info (ignore_abfd, symbol, ret)
bfd_symbol_info (symbol, ret); bfd_symbol_info (symbol, ret);
} }
#define binary_bfd_is_local_label bfd_generic_is_local_label #define binary_bfd_is_local_label_name bfd_generic_is_local_label_name
#define binary_get_lineno _bfd_nosymbols_get_lineno #define binary_get_lineno _bfd_nosymbols_get_lineno
#define binary_find_nearest_line _bfd_nosymbols_find_nearest_line #define binary_find_nearest_line _bfd_nosymbols_find_nearest_line
#define binary_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol #define binary_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
@ -255,21 +255,50 @@ binary_set_section_contents (abfd, sec, data, offset, size)
file_ptr offset; file_ptr offset;
bfd_size_type size; bfd_size_type size;
{ {
/* We don't want to output anything for a section that is neither
loaded nor allocated. The contents of such a section are not
meaningful in the binary format. */
if ((sec->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
return true;
if ((sec->flags & SEC_NEVER_LOAD) != 0)
return true;
if (! abfd->output_has_begun) if (! abfd->output_has_begun)
{ {
boolean found_low;
bfd_vma low; bfd_vma low;
asection *s; asection *s;
/* The lowest section VMA sets the virtual address of the start /* The lowest section LMA sets the virtual address of the start
of the file. We use the set the file position of all the of the file. We use this to set the file position of all the
sections. */ sections. */
low = abfd->sections->vma; found_low = false;
for (s = abfd->sections->next; s != NULL; s = s->next) low = 0;
if (s->vma < low) for (s = abfd->sections; s != NULL; s = s->next)
low = s->vma; if (((s->flags & (SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC))
== (SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC))
&& (! found_low || s->lma < low))
{
low = s->lma;
found_low = true;
}
for (s = abfd->sections; s != NULL; s = s->next) for (s = abfd->sections; s != NULL; s = s->next)
s->filepos = s->vma - low; {
s->filepos = s->lma - low;
/* If attempting to generate a binary file from a bfd with
LMA's all over the place, huge (sparse?) binary files may
result. This condition attempts to detect this situation
and print a warning. Better heuristics would be nice to
have. */
if (s->filepos < 0)
(*_bfd_error_handler)
(_("Warning: Writing section `%s' to huge offset %lu."),
bfd_get_section_name (abfd, s),
(unsigned long) s->filepos);
}
abfd->output_has_begun = true; abfd->output_has_begun = true;
} }
@ -290,6 +319,7 @@ binary_sizeof_headers (abfd, exec)
#define binary_bfd_get_relocated_section_contents \ #define binary_bfd_get_relocated_section_contents \
bfd_generic_get_relocated_section_contents bfd_generic_get_relocated_section_contents
#define binary_bfd_relax_section bfd_generic_relax_section #define binary_bfd_relax_section bfd_generic_relax_section
#define binary_bfd_gc_sections bfd_generic_gc_sections
#define binary_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define binary_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
#define binary_bfd_link_add_symbols _bfd_generic_link_add_symbols #define binary_bfd_link_add_symbols _bfd_generic_link_add_symbols
#define binary_bfd_final_link _bfd_generic_final_link #define binary_bfd_final_link _bfd_generic_final_link
@ -301,8 +331,8 @@ const bfd_target binary_vec =
{ {
"binary", /* name */ "binary", /* name */
bfd_target_unknown_flavour, /* flavour */ bfd_target_unknown_flavour, /* flavour */
true, /* byteorder_big_p */ BFD_ENDIAN_UNKNOWN, /* byteorder */
true, /* header_byteorder_big_p */ BFD_ENDIAN_UNKNOWN, /* header_byteorder */
EXEC_P, /* object_flags */ EXEC_P, /* object_flags */
(SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA
| SEC_ROM | SEC_HAS_CONTENTS), /* section_flags */ | SEC_ROM | SEC_HAS_CONTENTS), /* section_flags */