Line 1... |
Line 1... |
/* SEC_MERGE support.
|
/* SEC_MERGE support.
|
Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
Written by Jakub Jelinek <jakub@redhat.com>.
|
Written by Jakub Jelinek <jakub@redhat.com>.
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
Line 106... |
Line 106... |
struct bfd_hash_table *table, const char *string)
|
struct bfd_hash_table *table, const char *string)
|
{
|
{
|
/* Allocate the structure if it has not already been allocated by a
|
/* Allocate the structure if it has not already been allocated by a
|
subclass. */
|
subclass. */
|
if (entry == NULL)
|
if (entry == NULL)
|
entry = bfd_hash_allocate (table, sizeof (struct sec_merge_hash_entry));
|
entry = (struct bfd_hash_entry *)
|
|
bfd_hash_allocate (table, sizeof (struct sec_merge_hash_entry));
|
if (entry == NULL)
|
if (entry == NULL)
|
return NULL;
|
return NULL;
|
|
|
/* Call the allocation method of the superclass. */
|
/* Call the allocation method of the superclass. */
|
entry = bfd_hash_newfunc (entry, table, string);
|
entry = bfd_hash_newfunc (entry, table, string);
|
Line 233... |
Line 234... |
static struct sec_merge_hash *
|
static struct sec_merge_hash *
|
sec_merge_init (unsigned int entsize, bfd_boolean strings)
|
sec_merge_init (unsigned int entsize, bfd_boolean strings)
|
{
|
{
|
struct sec_merge_hash *table;
|
struct sec_merge_hash *table;
|
|
|
table = bfd_malloc (sizeof (struct sec_merge_hash));
|
table = (struct sec_merge_hash *) bfd_malloc (sizeof (struct sec_merge_hash));
|
if (table == NULL)
|
if (table == NULL)
|
return NULL;
|
return NULL;
|
|
|
if (! bfd_hash_table_init_n (&table->table, sec_merge_hash_newfunc,
|
if (! bfd_hash_table_init_n (&table->table, sec_merge_hash_newfunc,
|
sizeof (struct sec_merge_hash_entry), 16699))
|
sizeof (struct sec_merge_hash_entry), 16699))
|
Line 291... |
Line 292... |
bfd_size_type off = 0;
|
bfd_size_type off = 0;
|
int alignment_power = sec->output_section->alignment_power;
|
int alignment_power = sec->output_section->alignment_power;
|
|
|
if (alignment_power)
|
if (alignment_power)
|
{
|
{
|
pad = bfd_zmalloc ((bfd_size_type) 1 << alignment_power);
|
pad = (char *) bfd_zmalloc ((bfd_size_type) 1 << alignment_power);
|
if (pad == NULL)
|
if (pad == NULL)
|
return FALSE;
|
return FALSE;
|
}
|
}
|
|
|
for (; entry != NULL && entry->secinfo == secinfo; entry = entry->next)
|
for (; entry != NULL && entry->secinfo == secinfo; entry = entry->next)
|
Line 388... |
Line 389... |
break;
|
break;
|
|
|
if (sinfo == NULL)
|
if (sinfo == NULL)
|
{
|
{
|
/* Initialize the information we need to keep track of. */
|
/* Initialize the information we need to keep track of. */
|
sinfo = bfd_alloc (abfd, sizeof (struct sec_merge_info));
|
sinfo = (struct sec_merge_info *)
|
|
bfd_alloc (abfd, sizeof (struct sec_merge_info));
|
if (sinfo == NULL)
|
if (sinfo == NULL)
|
goto error_return;
|
goto error_return;
|
sinfo->next = (struct sec_merge_info *) *psinfo;
|
sinfo->next = (struct sec_merge_info *) *psinfo;
|
sinfo->chain = NULL;
|
sinfo->chain = NULL;
|
*psinfo = sinfo;
|
*psinfo = sinfo;
|
Line 599... |
Line 601... |
bfd_size_type size, amt;
|
bfd_size_type size, amt;
|
unsigned int alignment = 0;
|
unsigned int alignment = 0;
|
|
|
/* Now sort the strings */
|
/* Now sort the strings */
|
amt = sinfo->htab->size * sizeof (struct sec_merge_hash_entry *);
|
amt = sinfo->htab->size * sizeof (struct sec_merge_hash_entry *);
|
array = bfd_malloc (amt);
|
array = (struct sec_merge_hash_entry **) bfd_malloc (amt);
|
if (array == NULL)
|
if (array == NULL)
|
goto alloc_failure;
|
goto alloc_failure;
|
|
|
for (e = sinfo->htab->first, a = array; e; e = e->next)
|
for (e = sinfo->htab->first, a = array; e; e = e->next)
|
if (e->alignment)
|
if (e->alignment)
|
Line 790... |
Line 792... |
return FALSE;
|
return FALSE;
|
|
|
if (secinfo->first_str == NULL)
|
if (secinfo->first_str == NULL)
|
return TRUE;
|
return TRUE;
|
|
|
|
/* FIXME: octets_per_byte. */
|
pos = sec->output_section->filepos + sec->output_offset;
|
pos = sec->output_section->filepos + sec->output_offset;
|
if (bfd_seek (output_bfd, pos, SEEK_SET) != 0)
|
if (bfd_seek (output_bfd, pos, SEEK_SET) != 0)
|
return FALSE;
|
return FALSE;
|
|
|
if (! sec_merge_emit (output_bfd, secinfo->first_str))
|
if (! sec_merge_emit (output_bfd, secinfo->first_str))
|