* aoutx.h (NAME(aout,set_section_contents)): Double check that the
caller is writing to a valid section. PR 5996 cleanup.
This commit is contained in:
parent
c9f92c114b
commit
773033d2d2
2 changed files with 56 additions and 29 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Thu Mar 2 15:58:24 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* aoutx.h (NAME(aout,set_section_contents)): Double check that the
|
||||||
|
caller is writing to a valid section.
|
||||||
|
|
||||||
Thu Mar 2 14:37:57 1995 Bryan Ford <baford@cs.utah.edu>
|
Thu Mar 2 14:37:57 1995 Bryan Ford <baford@cs.utah.edu>
|
||||||
|
|
||||||
* binary.c: Add support for reading binary files. Loads the raw
|
* binary.c: Add support for reading binary files. Loads the raw
|
||||||
|
|
80
bfd/aoutx.h
80
bfd/aoutx.h
|
@ -1166,26 +1166,32 @@ NAME(aout,set_section_contents) (abfd, section, location, offset, count)
|
||||||
file_ptr text_end;
|
file_ptr text_end;
|
||||||
bfd_size_type text_size;
|
bfd_size_type text_size;
|
||||||
|
|
||||||
if (abfd->output_has_begun == false)
|
if (! abfd->output_has_begun)
|
||||||
{
|
{
|
||||||
if (NAME(aout,adjust_sizes_and_vmas) (abfd,
|
if (! NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
|
||||||
&text_size,
|
return false;
|
||||||
&text_end) == false)
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* regardless, once we know what we're doing, we might as well get going */
|
if (section == obj_bsssec (abfd))
|
||||||
if (section != obj_bsssec(abfd))
|
{
|
||||||
{
|
bfd_set_error (bfd_error_no_contents);
|
||||||
if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0)
|
return false;
|
||||||
return false;
|
}
|
||||||
|
|
||||||
|
if (section != obj_textsec (abfd)
|
||||||
|
&& section != obj_datasec (abfd))
|
||||||
|
{
|
||||||
|
bfd_set_error (bfd_error_nonrepresentable_section);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count != 0)
|
||||||
|
{
|
||||||
|
if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
|
||||||
|
|| bfd_write (location, 1, count, abfd) != count)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (count) {
|
|
||||||
return (bfd_write ((PTR)location, 1, count, abfd) == count) ?
|
|
||||||
true : false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2140,6 +2146,14 @@ NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols)
|
||||||
>> RELOC_EXT_BITS_TYPE_SH_LITTLE;
|
>> RELOC_EXT_BITS_TYPE_SH_LITTLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r_extern && r_index > bfd_get_symcount (abfd))
|
||||||
|
{
|
||||||
|
/* We could arrange to return an error, but it might be useful
|
||||||
|
to see the file even if it is bad. */
|
||||||
|
r_extern = 0;
|
||||||
|
r_index = N_ABS;
|
||||||
|
}
|
||||||
|
|
||||||
cache_ptr->howto = howto_table_ext + r_type;
|
cache_ptr->howto = howto_table_ext + r_type;
|
||||||
MOVE_ADDRESS(GET_SWORD(abfd, bytes->r_addend));
|
MOVE_ADDRESS(GET_SWORD(abfd, bytes->r_addend));
|
||||||
}
|
}
|
||||||
|
@ -2192,6 +2206,14 @@ NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols)
|
||||||
cache_ptr->howto = howto_table_std + howto_idx;
|
cache_ptr->howto = howto_table_std + howto_idx;
|
||||||
BFD_ASSERT (cache_ptr->howto->type != -1);
|
BFD_ASSERT (cache_ptr->howto->type != -1);
|
||||||
|
|
||||||
|
if (r_extern && r_index > bfd_get_symcount (abfd))
|
||||||
|
{
|
||||||
|
/* We could arrange to return an error, but it might be useful
|
||||||
|
to see the file even if it is bad. */
|
||||||
|
r_extern = 0;
|
||||||
|
r_index = N_ABS;
|
||||||
|
}
|
||||||
|
|
||||||
MOVE_ADDRESS(0);
|
MOVE_ADDRESS(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2955,13 +2977,13 @@ aout_link_check_ar_symbols (abfd, info, pneeded)
|
||||||
/* Turn the current link symbol into a common
|
/* Turn the current link symbol into a common
|
||||||
symbol. It is already on the undefs list. */
|
symbol. It is already on the undefs list. */
|
||||||
h->type = bfd_link_hash_common;
|
h->type = bfd_link_hash_common;
|
||||||
|
h->u.c.p = ((struct bfd_link_hash_common_entry *)
|
||||||
|
bfd_hash_allocate (&info->hash->table,
|
||||||
|
sizeof (struct bfd_link_hash_common_entry)));
|
||||||
|
if (h->u.c.p == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
h->u.c.size = value;
|
h->u.c.size = value;
|
||||||
if (h->u.c.size != value)
|
|
||||||
{
|
|
||||||
/* The size did not fit in the bitfield. */
|
|
||||||
bfd_set_error (bfd_error_bad_value);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: This isn't quite right. The maximum
|
/* FIXME: This isn't quite right. The maximum
|
||||||
alignment of a common symbol should be set by the
|
alignment of a common symbol should be set by the
|
||||||
|
@ -2970,10 +2992,10 @@ aout_link_check_ar_symbols (abfd, info, pneeded)
|
||||||
power = bfd_log2 (value);
|
power = bfd_log2 (value);
|
||||||
if (power > bfd_get_arch_info (abfd)->section_align_power)
|
if (power > bfd_get_arch_info (abfd)->section_align_power)
|
||||||
power = bfd_get_arch_info (abfd)->section_align_power;
|
power = bfd_get_arch_info (abfd)->section_align_power;
|
||||||
h->u.c.alignment_power = power;
|
h->u.c.p->alignment_power = power;
|
||||||
|
|
||||||
h->u.c.section = bfd_make_section_old_way (symbfd,
|
h->u.c.p->section = bfd_make_section_old_way (symbfd,
|
||||||
"COMMON");
|
"COMMON");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3208,9 +3230,9 @@ aout_link_add_symbols (abfd, info)
|
||||||
This isn't quite right: it should use the architecture of the
|
This isn't quite right: it should use the architecture of the
|
||||||
output file, not the input files. */
|
output file, not the input files. */
|
||||||
if ((*sym_hash)->root.type == bfd_link_hash_common
|
if ((*sym_hash)->root.type == bfd_link_hash_common
|
||||||
&& ((*sym_hash)->root.u.c.alignment_power >
|
&& ((*sym_hash)->root.u.c.p->alignment_power >
|
||||||
bfd_get_arch_info (abfd)->section_align_power))
|
bfd_get_arch_info (abfd)->section_align_power))
|
||||||
(*sym_hash)->root.u.c.alignment_power =
|
(*sym_hash)->root.u.c.p->alignment_power =
|
||||||
bfd_get_arch_info (abfd)->section_align_power;
|
bfd_get_arch_info (abfd)->section_align_power;
|
||||||
|
|
||||||
/* If this is a set symbol, and we are not building sets, then
|
/* If this is a set symbol, and we are not building sets, then
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue