mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-01-26 11:34:43 +00:00
Support arbitrary length fill patterns.
* linker.c (bfd_new_link_order): Zero all fields with bfd_zalloc. (_bfd_default_link_order): Remove bfd_fill_link_order code. Call default_data_link_order. (default_fill_link_order): Delete. (default_data_link_order): New function. * elf32-mips.c (_bfd_mips_elf_final_link): Replace occurrences of bfd_fill_link_order with bfd_data_link_order. * elf64-alpha.c (elf64_alpha_final_link): Likewise. * elf64-mips.c (mips_elf64_final_link): Likewise.
This commit is contained in:
parent
9a1b9f826d
commit
fd96f80fc8
@ -1,5 +1,16 @@
|
||||
2002-02-15 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
Support arbitrary length fill patterns.
|
||||
* linker.c (bfd_new_link_order): Zero all fields with bfd_zalloc.
|
||||
(_bfd_default_link_order): Remove bfd_fill_link_order code.
|
||||
Call default_data_link_order.
|
||||
(default_fill_link_order): Delete.
|
||||
(default_data_link_order): New function.
|
||||
* elf32-mips.c (_bfd_mips_elf_final_link): Replace occurrences
|
||||
of bfd_fill_link_order with bfd_data_link_order.
|
||||
* elf64-alpha.c (elf64_alpha_final_link): Likewise.
|
||||
* elf64-mips.c (mips_elf64_final_link): Likewise.
|
||||
|
||||
* bfd.c (bfd_scan_vma): Clamp overflows to max bfd_vma value.
|
||||
Correct value returned in "end" for "0x<non-hex>".
|
||||
|
||||
|
@ -5271,7 +5271,7 @@ _bfd_mips_elf_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
@ -5398,7 +5398,7 @@ _bfd_mips_elf_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
@ -5554,7 +5554,7 @@ _bfd_mips_elf_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
@ -5634,7 +5634,7 @@ _bfd_mips_elf_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
|
@ -4105,7 +4105,7 @@ elf64_alpha_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
|
@ -6518,7 +6518,7 @@ mips_elf64_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
@ -6655,7 +6655,7 @@ mips_elf64_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
@ -6734,7 +6734,7 @@ mips_elf64_final_link (abfd, info)
|
||||
|
||||
if (p->type != bfd_indirect_link_order)
|
||||
{
|
||||
if (p->type == bfd_fill_link_order)
|
||||
if (p->type == bfd_data_link_order)
|
||||
continue;
|
||||
abort ();
|
||||
}
|
||||
|
72
bfd/linker.c
72
bfd/linker.c
@ -1,5 +1,5 @@
|
||||
/* linker.c -- BFD linker routines
|
||||
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
|
||||
Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support
|
||||
|
||||
@ -426,7 +426,7 @@ static void set_symbol_from_hash
|
||||
PARAMS ((asymbol *, struct bfd_link_hash_entry *));
|
||||
static boolean generic_add_output_symbol
|
||||
PARAMS ((bfd *, size_t *psymalloc, asymbol *));
|
||||
static boolean default_fill_link_order
|
||||
static boolean default_data_link_order
|
||||
PARAMS ((bfd *, struct bfd_link_info *, asection *,
|
||||
struct bfd_link_order *));
|
||||
static boolean default_indirect_link_order
|
||||
@ -2608,14 +2608,13 @@ bfd_new_link_order (abfd, section)
|
||||
asection *section;
|
||||
{
|
||||
bfd_size_type amt = sizeof (struct bfd_link_order);
|
||||
struct bfd_link_order *new = (struct bfd_link_order *) bfd_alloc (abfd, amt);
|
||||
struct bfd_link_order *new;
|
||||
|
||||
new = (struct bfd_link_order *) bfd_zalloc (abfd, amt);
|
||||
if (!new)
|
||||
return NULL;
|
||||
|
||||
new->type = bfd_undefined_link_order;
|
||||
new->offset = 0;
|
||||
new->size = 0;
|
||||
new->next = (struct bfd_link_order *) NULL;
|
||||
|
||||
if (section->link_order_tail != (struct bfd_link_order *) NULL)
|
||||
section->link_order_tail->next = new;
|
||||
@ -2637,8 +2636,6 @@ _bfd_default_link_order (abfd, info, sec, link_order)
|
||||
asection *sec;
|
||||
struct bfd_link_order *link_order;
|
||||
{
|
||||
file_ptr loc;
|
||||
|
||||
switch (link_order->type)
|
||||
{
|
||||
case bfd_undefined_link_order:
|
||||
@ -2649,29 +2646,23 @@ _bfd_default_link_order (abfd, info, sec, link_order)
|
||||
case bfd_indirect_link_order:
|
||||
return default_indirect_link_order (abfd, info, sec, link_order,
|
||||
false);
|
||||
case bfd_fill_link_order:
|
||||
return default_fill_link_order (abfd, info, sec, link_order);
|
||||
case bfd_data_link_order:
|
||||
loc = link_order->offset * bfd_octets_per_byte (abfd);
|
||||
return bfd_set_section_contents (abfd, sec,
|
||||
(PTR) link_order->u.data.contents,
|
||||
loc, link_order->size);
|
||||
return default_data_link_order (abfd, info, sec, link_order);
|
||||
}
|
||||
}
|
||||
|
||||
/* Default routine to handle a bfd_fill_link_order. */
|
||||
/* Default routine to handle a bfd_data_link_order. */
|
||||
|
||||
static boolean
|
||||
default_fill_link_order (abfd, info, sec, link_order)
|
||||
default_data_link_order (abfd, info, sec, link_order)
|
||||
bfd *abfd;
|
||||
struct bfd_link_info *info ATTRIBUTE_UNUSED;
|
||||
asection *sec;
|
||||
struct bfd_link_order *link_order;
|
||||
{
|
||||
bfd_size_type size;
|
||||
unsigned char *space;
|
||||
size_t i;
|
||||
unsigned int fill;
|
||||
size_t fill_size;
|
||||
bfd_byte *fill;
|
||||
file_ptr loc;
|
||||
boolean result;
|
||||
|
||||
@ -2681,24 +2672,37 @@ default_fill_link_order (abfd, info, sec, link_order)
|
||||
if (size == 0)
|
||||
return true;
|
||||
|
||||
space = (unsigned char *) bfd_malloc (size);
|
||||
if (space == NULL)
|
||||
return false;
|
||||
|
||||
fill = link_order->u.fill.value;
|
||||
for (i = 0; i < size; i += 4)
|
||||
space[i] = fill >> 24;
|
||||
for (i = 1; i < size; i += 4)
|
||||
space[i] = fill >> 16;
|
||||
for (i = 2; i < size; i += 4)
|
||||
space[i] = fill >> 8;
|
||||
for (i = 3; i < size; i += 4)
|
||||
space[i] = fill;
|
||||
fill = link_order->u.data.contents;
|
||||
fill_size = link_order->u.data.size;
|
||||
if (fill_size != 0 && fill_size < size)
|
||||
{
|
||||
bfd_byte *p;
|
||||
fill = (bfd_byte *) bfd_malloc (size);
|
||||
if (fill == NULL)
|
||||
return false;
|
||||
p = fill;
|
||||
if (fill_size == 1)
|
||||
memset (p, (int) link_order->u.data.contents[0], (size_t) size);
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
memcpy (p, link_order->u.data.contents, fill_size);
|
||||
p += fill_size;
|
||||
size -= fill_size;
|
||||
}
|
||||
while (size >= fill_size);
|
||||
if (size != 0)
|
||||
memcpy (p, link_order->u.data.contents, (size_t) size);
|
||||
size = link_order->size;
|
||||
}
|
||||
}
|
||||
|
||||
loc = link_order->offset * bfd_octets_per_byte (abfd);
|
||||
result = bfd_set_section_contents (abfd, sec, space, loc, size);
|
||||
result = bfd_set_section_contents (abfd, sec, fill, loc, size);
|
||||
|
||||
free (space);
|
||||
if (fill != link_order->u.data.contents)
|
||||
free (fill);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user