forked from Imagelibrary/binutils-gdb
@@ -1,3 +1,7 @@
|
|||||||
|
2001-01-04 Kazu Hirata <kazu@hxi.com>
|
||||||
|
|
||||||
|
* som.c: Fix formatting.
|
||||||
|
|
||||||
2001-01-03 Kazu Hirata <kazu@hxi.com>
|
2001-01-03 Kazu Hirata <kazu@hxi.com>
|
||||||
|
|
||||||
* ecoffswap.h: Fix formatting.
|
* ecoffswap.h: Fix formatting.
|
||||||
|
|||||||
147
bfd/som.c
147
bfd/som.c
@@ -110,17 +110,15 @@
|
|||||||
|
|
||||||
Note one side effect of using a R_PREV_FIXUP is the relocation that
|
Note one side effect of using a R_PREV_FIXUP is the relocation that
|
||||||
is being repeated moves to the front of the queue. */
|
is being repeated moves to the front of the queue. */
|
||||||
struct reloc_queue
|
struct reloc_queue {
|
||||||
{
|
|
||||||
unsigned char *reloc;
|
unsigned char *reloc;
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
} reloc_queue[4];
|
} reloc_queue[4];
|
||||||
|
|
||||||
/* This fully describes the symbol types which may be attached to
|
/* This fully describes the symbol types which may be attached to
|
||||||
an EXPORT or IMPORT directive. Only SOM uses this formation
|
an EXPORT or IMPORT directive. Only SOM uses this formation
|
||||||
(ELF has no need for it). */
|
(ELF has no need for it). */
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
SYMBOL_TYPE_UNKNOWN,
|
SYMBOL_TYPE_UNKNOWN,
|
||||||
SYMBOL_TYPE_ABSOLUTE,
|
SYMBOL_TYPE_ABSOLUTE,
|
||||||
SYMBOL_TYPE_CODE,
|
SYMBOL_TYPE_CODE,
|
||||||
@@ -132,16 +130,14 @@ typedef enum
|
|||||||
SYMBOL_TYPE_SEC_PROG,
|
SYMBOL_TYPE_SEC_PROG,
|
||||||
} pa_symbol_type;
|
} pa_symbol_type;
|
||||||
|
|
||||||
struct section_to_type
|
struct section_to_type {
|
||||||
{
|
|
||||||
char *section;
|
char *section;
|
||||||
char type;
|
char type;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Assorted symbol information that needs to be derived from the BFD symbol
|
/* Assorted symbol information that needs to be derived from the BFD symbol
|
||||||
and/or the BFD backend private symbol data. */
|
and/or the BFD backend private symbol data. */
|
||||||
struct som_misc_symbol_info
|
struct som_misc_symbol_info {
|
||||||
{
|
|
||||||
unsigned int symbol_type;
|
unsigned int symbol_type;
|
||||||
unsigned int symbol_scope;
|
unsigned int symbol_scope;
|
||||||
unsigned int arg_reloc;
|
unsigned int arg_reloc;
|
||||||
@@ -379,14 +375,12 @@ static const struct section_to_type stt[] = {
|
|||||||
addil foo-$global$-0x1234 would use an override for "0x1234" rather
|
addil foo-$global$-0x1234 would use an override for "0x1234" rather
|
||||||
than storing it into the addil itself. */
|
than storing it into the addil itself. */
|
||||||
|
|
||||||
struct fixup_format
|
struct fixup_format {
|
||||||
{
|
|
||||||
int D;
|
int D;
|
||||||
const char *format;
|
const char *format;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct fixup_format som_fixup_formats[256] =
|
static const struct fixup_format som_fixup_formats[256] = {
|
||||||
{
|
|
||||||
/* R_NO_RELOCATION */
|
/* R_NO_RELOCATION */
|
||||||
0, "LD1+4*=", /* 0x00 */
|
0, "LD1+4*=", /* 0x00 */
|
||||||
1, "LD1+4*=", /* 0x01 */
|
1, "LD1+4*=", /* 0x01 */
|
||||||
@@ -699,8 +693,7 @@ static const struct fixup_format som_fixup_formats[256] =
|
|||||||
0, "", /* 0xff */
|
0, "", /* 0xff */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int comp1_opcodes[] =
|
static const int comp1_opcodes[] = {
|
||||||
{
|
|
||||||
0x00,
|
0x00,
|
||||||
0x40,
|
0x40,
|
||||||
0x41,
|
0x41,
|
||||||
@@ -721,8 +714,7 @@ static const int comp1_opcodes[] =
|
|||||||
-1
|
-1
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int comp2_opcodes[] =
|
static const int comp2_opcodes[] = {
|
||||||
{
|
|
||||||
0x00,
|
0x00,
|
||||||
0x80,
|
0x80,
|
||||||
0x82,
|
0x82,
|
||||||
@@ -730,8 +722,7 @@ static const int comp2_opcodes[] =
|
|||||||
-1
|
-1
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int comp3_opcodes[] =
|
static const int comp3_opcodes[] = {
|
||||||
{
|
|
||||||
0x00,
|
0x00,
|
||||||
0x02,
|
0x02,
|
||||||
-1
|
-1
|
||||||
@@ -787,8 +778,7 @@ static const int comp3_opcodes[] =
|
|||||||
#define SOM_HOWTO(TYPE, NAME) \
|
#define SOM_HOWTO(TYPE, NAME) \
|
||||||
HOWTO(TYPE, 0, 0, 32, false, 0, 0, hppa_som_reloc, NAME, false, 0, 0, false)
|
HOWTO(TYPE, 0, 0, 32, false, 0, 0, hppa_som_reloc, NAME, false, 0, 0, false)
|
||||||
|
|
||||||
static reloc_howto_type som_hppa_howto_table[] =
|
static reloc_howto_type som_hppa_howto_table[] = {
|
||||||
{
|
|
||||||
SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
|
SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
|
||||||
SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
|
SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
|
||||||
SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
|
SOM_HOWTO (R_NO_RELOCATION, "R_NO_RELOCATION"),
|
||||||
@@ -1044,7 +1034,8 @@ static reloc_howto_type som_hppa_howto_table[] =
|
|||||||
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
|
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
|
||||||
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
|
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
|
||||||
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
|
SOM_HOWTO (R_RESERVED, "R_RESERVED"),
|
||||||
SOM_HOWTO (R_RESERVED, "R_RESERVED")};
|
SOM_HOWTO (R_RESERVED, "R_RESERVED")
|
||||||
|
};
|
||||||
|
|
||||||
/* Initialize the SOM relocation queue. By definition the queue holds
|
/* Initialize the SOM relocation queue. By definition the queue holds
|
||||||
the last four multibyte fixups. */
|
the last four multibyte fixups. */
|
||||||
@@ -1579,10 +1570,10 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff, sym)
|
|||||||
/* The difference of two symbols needs *very* special handling. */
|
/* The difference of two symbols needs *very* special handling. */
|
||||||
if (sym_diff)
|
if (sym_diff)
|
||||||
{
|
{
|
||||||
final_types[0] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
final_types[1] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[1] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
final_types[2] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[2] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
final_types[3] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[3] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
if (!final_types[0] || !final_types[1] || !final_types[2])
|
if (!final_types[0] || !final_types[1] || !final_types[2])
|
||||||
return NULL;
|
return NULL;
|
||||||
if (field == e_fsel)
|
if (field == e_fsel)
|
||||||
@@ -1659,10 +1650,10 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff, sym)
|
|||||||
/* The difference of two symbols needs *very* special handling. */
|
/* The difference of two symbols needs *very* special handling. */
|
||||||
if (sym_diff)
|
if (sym_diff)
|
||||||
{
|
{
|
||||||
final_types[0] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[0] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
final_types[1] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[1] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
final_types[2] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[2] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
final_types[3] = (int *)bfd_alloc (abfd, sizeof (int));
|
final_types[3] = (int *) bfd_alloc (abfd, sizeof (int));
|
||||||
if (!final_types[0] || !final_types[1] || !final_types[2])
|
if (!final_types[0] || !final_types[1] || !final_types[2])
|
||||||
return NULL;
|
return NULL;
|
||||||
if (field == e_fsel)
|
if (field == e_fsel)
|
||||||
@@ -1716,7 +1707,6 @@ hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff, sym)
|
|||||||
/* Return the address of the correct entry in the PA SOM relocation
|
/* Return the address of the correct entry in the PA SOM relocation
|
||||||
howto table. */
|
howto table. */
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
static reloc_howto_type *
|
static reloc_howto_type *
|
||||||
som_bfd_reloc_type_lookup (abfd, code)
|
som_bfd_reloc_type_lookup (abfd, code)
|
||||||
bfd *abfd ATTRIBUTE_UNUSED;
|
bfd *abfd ATTRIBUTE_UNUSED;
|
||||||
@@ -1782,7 +1772,7 @@ som_object_setup (abfd, file_hdrp, aux_hdrp, current_offset)
|
|||||||
|
|
||||||
/* Allocate space to hold the saved exec header information. */
|
/* Allocate space to hold the saved exec header information. */
|
||||||
obj_som_exec_data (abfd) = (struct som_exec_data *)
|
obj_som_exec_data (abfd) = (struct som_exec_data *)
|
||||||
bfd_zalloc (abfd, sizeof (struct som_exec_data ));
|
bfd_zalloc (abfd, sizeof (struct som_exec_data));
|
||||||
if (obj_som_exec_data (abfd) == NULL)
|
if (obj_som_exec_data (abfd) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -1856,7 +1846,7 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
unsigned int total_subspaces = 0;
|
unsigned int total_subspaces = 0;
|
||||||
asection **subspace_sections, *section;
|
asection **subspace_sections, *section;
|
||||||
|
|
||||||
/* First, read in space names */
|
/* First, read in space names. */
|
||||||
|
|
||||||
space_strings = bfd_malloc (file_hdr->space_strings_size);
|
space_strings = bfd_malloc (file_hdr->space_strings_size);
|
||||||
if (!space_strings && file_hdr->space_strings_size != 0)
|
if (!space_strings && file_hdr->space_strings_size != 0)
|
||||||
@@ -1869,7 +1859,7 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
!= file_hdr->space_strings_size)
|
!= file_hdr->space_strings_size)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* Loop over all of the space dictionaries, building up sections */
|
/* Loop over all of the space dictionaries, building up sections. */
|
||||||
for (space_index = 0; space_index < file_hdr->space_total; space_index++)
|
for (space_index = 0; space_index < file_hdr->space_total; space_index++)
|
||||||
{
|
{
|
||||||
struct space_dictionary_record space;
|
struct space_dictionary_record space;
|
||||||
@@ -1878,7 +1868,7 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
asection *space_asect;
|
asection *space_asect;
|
||||||
char *newname;
|
char *newname;
|
||||||
|
|
||||||
/* Read the space dictionary element */
|
/* Read the space dictionary element. */
|
||||||
if (bfd_seek (abfd,
|
if (bfd_seek (abfd,
|
||||||
(current_offset + file_hdr->space_location
|
(current_offset + file_hdr->space_location
|
||||||
+ space_index * sizeof space),
|
+ space_index * sizeof space),
|
||||||
@@ -1887,10 +1877,10 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
if (bfd_read (&space, 1, sizeof space, abfd) != sizeof space)
|
if (bfd_read (&space, 1, sizeof space, abfd) != sizeof space)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* Setup the space name string */
|
/* Setup the space name string. */
|
||||||
space.name.n_name = space.name.n_strx + space_strings;
|
space.name.n_name = space.name.n_strx + space_strings;
|
||||||
|
|
||||||
/* Make a section out of it */
|
/* Make a section out of it. */
|
||||||
newname = bfd_alloc (abfd, strlen (space.name.n_name) + 1);
|
newname = bfd_alloc (abfd, strlen (space.name.n_name) + 1);
|
||||||
if (!newname)
|
if (!newname)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
@@ -1913,7 +1903,7 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
if (space.subspace_quantity == 0)
|
if (space.subspace_quantity == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Now, read in the first subspace for this space */
|
/* Now, read in the first subspace for this space. */
|
||||||
if (bfd_seek (abfd,
|
if (bfd_seek (abfd,
|
||||||
(current_offset + file_hdr->subspace_location
|
(current_offset + file_hdr->subspace_location
|
||||||
+ space.subspace_index * sizeof subspace),
|
+ space.subspace_index * sizeof subspace),
|
||||||
@@ -1921,14 +1911,15 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
goto error_return;
|
goto error_return;
|
||||||
if (bfd_read (&subspace, 1, sizeof subspace, abfd) != sizeof subspace)
|
if (bfd_read (&subspace, 1, sizeof subspace, abfd) != sizeof subspace)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
/* Seek back to the start of the subspaces for loop below */
|
/* Seek back to the start of the subspaces for loop below. */
|
||||||
if (bfd_seek (abfd,
|
if (bfd_seek (abfd,
|
||||||
(current_offset + file_hdr->subspace_location
|
(current_offset + file_hdr->subspace_location
|
||||||
+ space.subspace_index * sizeof subspace),
|
+ space.subspace_index * sizeof subspace),
|
||||||
SEEK_SET) < 0)
|
SEEK_SET) < 0)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* Setup the start address and file loc from the first subspace record */
|
/* Setup the start address and file loc from the first subspace
|
||||||
|
record. */
|
||||||
space_asect->vma = subspace.subspace_start;
|
space_asect->vma = subspace.subspace_start;
|
||||||
space_asect->filepos = subspace.file_loc_init_value + current_offset;
|
space_asect->filepos = subspace.file_loc_init_value + current_offset;
|
||||||
space_asect->alignment_power = log2 (subspace.alignment);
|
space_asect->alignment_power = log2 (subspace.alignment);
|
||||||
@@ -1939,18 +1930,18 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
loop placed any useful values into it. */
|
loop placed any useful values into it. */
|
||||||
memset (&save_subspace, 0, sizeof (struct subspace_dictionary_record));
|
memset (&save_subspace, 0, sizeof (struct subspace_dictionary_record));
|
||||||
|
|
||||||
/* Loop over the rest of the subspaces, building up more sections */
|
/* Loop over the rest of the subspaces, building up more sections. */
|
||||||
for (subspace_index = 0; subspace_index < space.subspace_quantity;
|
for (subspace_index = 0; subspace_index < space.subspace_quantity;
|
||||||
subspace_index++)
|
subspace_index++)
|
||||||
{
|
{
|
||||||
asection *subspace_asect;
|
asection *subspace_asect;
|
||||||
|
|
||||||
/* Read in the next subspace */
|
/* Read in the next subspace. */
|
||||||
if (bfd_read (&subspace, 1, sizeof subspace, abfd)
|
if (bfd_read (&subspace, 1, sizeof subspace, abfd)
|
||||||
!= sizeof subspace)
|
!= sizeof subspace)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* Setup the subspace name string */
|
/* Setup the subspace name string. */
|
||||||
subspace.name.n_name = subspace.name.n_strx + space_strings;
|
subspace.name.n_name = subspace.name.n_strx + space_strings;
|
||||||
|
|
||||||
newname = bfd_alloc (abfd, strlen (subspace.name.n_name) + 1);
|
newname = bfd_alloc (abfd, strlen (subspace.name.n_name) + 1);
|
||||||
@@ -1958,7 +1949,7 @@ setup_sections (abfd, file_hdr, current_offset)
|
|||||||
goto error_return;
|
goto error_return;
|
||||||
strcpy (newname, subspace.name.n_name);
|
strcpy (newname, subspace.name.n_name);
|
||||||
|
|
||||||
/* Make a section out of this subspace */
|
/* Make a section out of this subspace. */
|
||||||
subspace_asect = bfd_make_section_anyway (abfd, newname);
|
subspace_asect = bfd_make_section_anyway (abfd, newname);
|
||||||
if (!subspace_asect)
|
if (!subspace_asect)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
@@ -2165,7 +2156,7 @@ som_object_p (abfd)
|
|||||||
|
|
||||||
#ifdef EXECLIBMAGIC
|
#ifdef EXECLIBMAGIC
|
||||||
case EXECLIBMAGIC:
|
case EXECLIBMAGIC:
|
||||||
/* Read the lst header and determine where the SOM directory begins */
|
/* Read the lst header and determine where the SOM directory begins. */
|
||||||
|
|
||||||
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0)
|
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0)
|
||||||
{
|
{
|
||||||
@@ -2181,7 +2172,7 @@ som_object_p (abfd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Position to and read the first directory entry */
|
/* Position to and read the first directory entry. */
|
||||||
|
|
||||||
if (bfd_seek (abfd, lst_header.dir_loc, SEEK_SET) < 0)
|
if (bfd_seek (abfd, lst_header.dir_loc, SEEK_SET) < 0)
|
||||||
{
|
{
|
||||||
@@ -2197,7 +2188,7 @@ som_object_p (abfd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now position to the first SOM */
|
/* Now position to the first SOM. */
|
||||||
|
|
||||||
if (bfd_seek (abfd, som_entry.location, SEEK_SET) < 0)
|
if (bfd_seek (abfd, som_entry.location, SEEK_SET) < 0)
|
||||||
{
|
{
|
||||||
@@ -2208,7 +2199,7 @@ som_object_p (abfd)
|
|||||||
|
|
||||||
current_offset = som_entry.location;
|
current_offset = som_entry.location;
|
||||||
|
|
||||||
/* And finally, re-read the som header */
|
/* And finally, re-read the som header. */
|
||||||
|
|
||||||
if (bfd_read ((PTR) & file_hdr, 1, FILE_HDR_SIZE, abfd) != FILE_HDR_SIZE)
|
if (bfd_read ((PTR) & file_hdr, 1, FILE_HDR_SIZE, abfd) != FILE_HDR_SIZE)
|
||||||
{
|
{
|
||||||
@@ -2338,8 +2329,8 @@ som_prep_headers (abfd)
|
|||||||
if (som_is_space (section))
|
if (som_is_space (section))
|
||||||
{
|
{
|
||||||
/* Allocate space for the space dictionary. */
|
/* Allocate space for the space dictionary. */
|
||||||
som_section_data (section)->space_dict
|
som_section_data (section)->space_dict =
|
||||||
= (struct space_dictionary_record *)
|
(struct space_dictionary_record *)
|
||||||
bfd_zalloc (abfd, sizeof (struct space_dictionary_record));
|
bfd_zalloc (abfd, sizeof (struct space_dictionary_record));
|
||||||
if (som_section_data (section)->space_dict == NULL)
|
if (som_section_data (section)->space_dict == NULL)
|
||||||
return false;
|
return false;
|
||||||
@@ -3283,7 +3274,7 @@ som_write_symbol_strings (abfd, current_offset, syms, num_syms, string_sizep,
|
|||||||
/* Next comes the string itself + a null terminator. */
|
/* Next comes the string itself + a null terminator. */
|
||||||
strcpy (p, syms[i]->name);
|
strcpy (p, syms[i]->name);
|
||||||
|
|
||||||
som_symbol_data(syms[i])->stringtab_offset = strings_size;
|
som_symbol_data (syms[i])->stringtab_offset = strings_size;
|
||||||
p += length + 1;
|
p += length + 1;
|
||||||
strings_size += length + 1;
|
strings_size += length + 1;
|
||||||
|
|
||||||
@@ -3868,12 +3859,11 @@ som_finish_writing (abfd)
|
|||||||
section = abfd->sections;
|
section = abfd->sections;
|
||||||
for (i = 0; i < num_spaces; i++)
|
for (i = 0; i < num_spaces; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Find a space. */
|
/* Find a space. */
|
||||||
while (!som_is_space (section))
|
while (!som_is_space (section))
|
||||||
section = section->next;
|
section = section->next;
|
||||||
|
|
||||||
/* Dump its header */
|
/* Dump its header. */
|
||||||
if (bfd_write ((PTR) som_section_data (section)->space_dict,
|
if (bfd_write ((PTR) som_section_data (section)->space_dict,
|
||||||
sizeof (struct space_dictionary_record), 1, abfd)
|
sizeof (struct space_dictionary_record), 1, abfd)
|
||||||
!= sizeof (struct space_dictionary_record))
|
!= sizeof (struct space_dictionary_record))
|
||||||
@@ -3898,13 +3888,13 @@ som_finish_writing (abfd)
|
|||||||
/* Setting of the system_id has to happen very late now that copying of
|
/* Setting of the system_id has to happen very late now that copying of
|
||||||
BFD private data happens *after* section contents are set. */
|
BFD private data happens *after* section contents are set. */
|
||||||
if (abfd->flags & (EXEC_P | DYNAMIC))
|
if (abfd->flags & (EXEC_P | DYNAMIC))
|
||||||
obj_som_file_hdr(abfd)->system_id = obj_som_exec_data (abfd)->system_id;
|
obj_som_file_hdr (abfd)->system_id = obj_som_exec_data (abfd)->system_id;
|
||||||
else if (bfd_get_mach (abfd) == pa20)
|
else if (bfd_get_mach (abfd) == pa20)
|
||||||
obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC2_0;
|
obj_som_file_hdr (abfd)->system_id = CPU_PA_RISC2_0;
|
||||||
else if (bfd_get_mach (abfd) == pa11)
|
else if (bfd_get_mach (abfd) == pa11)
|
||||||
obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC1_1;
|
obj_som_file_hdr (abfd)->system_id = CPU_PA_RISC1_1;
|
||||||
else
|
else
|
||||||
obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC1_0;
|
obj_som_file_hdr (abfd)->system_id = CPU_PA_RISC1_0;
|
||||||
|
|
||||||
/* Compute the checksum for the file header just before writing
|
/* Compute the checksum for the file header just before writing
|
||||||
the header to disk. */
|
the header to disk. */
|
||||||
@@ -4178,7 +4168,6 @@ som_write_object_contents (abfd)
|
|||||||
|
|
||||||
return (som_finish_writing (abfd));
|
return (som_finish_writing (abfd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read and save the string table associated with the given BFD. */
|
/* Read and save the string table associated with the given BFD. */
|
||||||
|
|
||||||
@@ -4574,7 +4563,7 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
|
|||||||
unsigned char *save_fixup;
|
unsigned char *save_fixup;
|
||||||
int variables[26], stack[20], c, v, count, prev_fixup, *sp, saved_unwind_bits;
|
int variables[26], stack[20], c, v, count, prev_fixup, *sp, saved_unwind_bits;
|
||||||
const int *subop;
|
const int *subop;
|
||||||
arelent *rptr= internal_relocs;
|
arelent *rptr = internal_relocs;
|
||||||
unsigned int offset = 0;
|
unsigned int offset = 0;
|
||||||
|
|
||||||
#define var(c) variables[(c) - 'A']
|
#define var(c) variables[(c) - 'A']
|
||||||
@@ -4675,7 +4664,6 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
|
|||||||
push (v);
|
push (v);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
||||||
/* An operator. Pop two two values from the stack and
|
/* An operator. Pop two two values from the stack and
|
||||||
use them as operands to the given operation. Push
|
use them as operands to the given operation. Push
|
||||||
the result of the operation back on the stack. */
|
the result of the operation back on the stack. */
|
||||||
@@ -5036,7 +5024,7 @@ som_new_section_hook (abfd, newsect)
|
|||||||
return false;
|
return false;
|
||||||
newsect->alignment_power = 3;
|
newsect->alignment_power = 3;
|
||||||
|
|
||||||
/* We allow more than three sections internally */
|
/* We allow more than three sections internally. */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5068,6 +5056,7 @@ som_bfd_copy_private_symbol_data (ibfd, isymbol, obfd, osymbol)
|
|||||||
|
|
||||||
/* Copy any private info we understand from the input section
|
/* Copy any private info we understand from the input section
|
||||||
to the output section. */
|
to the output section. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
som_bfd_copy_private_section_data (ibfd, isection, obfd, osection)
|
som_bfd_copy_private_section_data (ibfd, isection, obfd, osection)
|
||||||
bfd *ibfd;
|
bfd *ibfd;
|
||||||
@@ -5081,8 +5070,8 @@ som_bfd_copy_private_section_data (ibfd, isection, obfd, osection)
|
|||||||
|| (!som_is_space (isection) && !som_is_subspace (isection)))
|
|| (!som_is_space (isection) && !som_is_subspace (isection)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
som_section_data (osection)->copy_data
|
som_section_data (osection)->copy_data =
|
||||||
= (struct som_copyable_section_data_struct *)
|
(struct som_copyable_section_data_struct *)
|
||||||
bfd_zalloc (obfd, sizeof (struct som_copyable_section_data_struct));
|
bfd_zalloc (obfd, sizeof (struct som_copyable_section_data_struct));
|
||||||
if (som_section_data (osection)->copy_data == NULL)
|
if (som_section_data (osection)->copy_data == NULL)
|
||||||
return false;
|
return false;
|
||||||
@@ -5138,8 +5127,8 @@ bfd_som_set_section_attributes (section, defined, private, sort_key, spnum)
|
|||||||
/* Allocate memory to hold the magic information. */
|
/* Allocate memory to hold the magic information. */
|
||||||
if (som_section_data (section)->copy_data == NULL)
|
if (som_section_data (section)->copy_data == NULL)
|
||||||
{
|
{
|
||||||
som_section_data (section)->copy_data
|
som_section_data (section)->copy_data =
|
||||||
= (struct som_copyable_section_data_struct *)
|
(struct som_copyable_section_data_struct *)
|
||||||
bfd_zalloc (section->owner,
|
bfd_zalloc (section->owner,
|
||||||
sizeof (struct som_copyable_section_data_struct));
|
sizeof (struct som_copyable_section_data_struct));
|
||||||
if (som_section_data (section)->copy_data == NULL)
|
if (som_section_data (section)->copy_data == NULL)
|
||||||
@@ -5168,8 +5157,8 @@ bfd_som_set_subsection_attributes (section, container, access,
|
|||||||
/* Allocate memory to hold the magic information. */
|
/* Allocate memory to hold the magic information. */
|
||||||
if (som_section_data (section)->copy_data == NULL)
|
if (som_section_data (section)->copy_data == NULL)
|
||||||
{
|
{
|
||||||
som_section_data (section)->copy_data
|
som_section_data (section)->copy_data =
|
||||||
= (struct som_copyable_section_data_struct *)
|
(struct som_copyable_section_data_struct *)
|
||||||
bfd_zalloc (section->owner,
|
bfd_zalloc (section->owner,
|
||||||
sizeof (struct som_copyable_section_data_struct));
|
sizeof (struct som_copyable_section_data_struct));
|
||||||
if (som_section_data (section)->copy_data == NULL)
|
if (som_section_data (section)->copy_data == NULL)
|
||||||
@@ -5198,6 +5187,7 @@ bfd_som_set_symbol_type (symbol, type)
|
|||||||
|
|
||||||
/* Attach an auxiliary header to the BFD backend so that it may be
|
/* Attach an auxiliary header to the BFD backend so that it may be
|
||||||
written into the object file. */
|
written into the object file. */
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
bfd_som_attach_aux_hdr (abfd, type, string)
|
bfd_som_attach_aux_hdr (abfd, type, string)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
@@ -5292,7 +5282,7 @@ som_get_section_contents (abfd, section, location, offset, count)
|
|||||||
return true;
|
return true;
|
||||||
if ((bfd_size_type) (offset+count) > section->_raw_size
|
if ((bfd_size_type) (offset+count) > section->_raw_size
|
||||||
|| bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) == -1
|
|| bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) == -1
|
||||||
|| bfd_read (location, (bfd_size_type)1, count, abfd) != count)
|
|| bfd_read (location, (bfd_size_type) 1, count, abfd) != count)
|
||||||
return (false); /* on error */
|
return (false); /* on error */
|
||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
@@ -5339,7 +5329,7 @@ som_set_arch_mach (abfd, arch, machine)
|
|||||||
enum bfd_architecture arch;
|
enum bfd_architecture arch;
|
||||||
unsigned long machine;
|
unsigned long machine;
|
||||||
{
|
{
|
||||||
/* Allow any architecture to be supported by the SOM backend */
|
/* Allow any architecture to be supported by the SOM backend. */
|
||||||
return bfd_default_set_arch_mach (abfd, arch, machine);
|
return bfd_default_set_arch_mach (abfd, arch, machine);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5397,7 +5387,7 @@ som_decode_symclass (symbol)
|
|||||||
return 'I';
|
return 'I';
|
||||||
if (symbol->flags & BSF_WEAK)
|
if (symbol->flags & BSF_WEAK)
|
||||||
return 'W';
|
return 'W';
|
||||||
if (!(symbol->flags & (BSF_GLOBAL|BSF_LOCAL)))
|
if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL)))
|
||||||
return '?';
|
return '?';
|
||||||
|
|
||||||
if (bfd_is_abs_section (symbol->section)
|
if (bfd_is_abs_section (symbol->section)
|
||||||
@@ -5423,7 +5413,7 @@ som_get_symbol_info (ignore_abfd, symbol, ret)
|
|||||||
{
|
{
|
||||||
ret->type = som_decode_symclass (symbol);
|
ret->type = som_decode_symclass (symbol);
|
||||||
if (ret->type != 'U')
|
if (ret->type != 'U')
|
||||||
ret->value = symbol->value+symbol->section->vma;
|
ret->value = symbol->value + symbol->section->vma;
|
||||||
else
|
else
|
||||||
ret->value = 0;
|
ret->value = 0;
|
||||||
ret->name = symbol->name;
|
ret->name = symbol->name;
|
||||||
@@ -5650,6 +5640,7 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read in the LST from the archive. */
|
/* Read in the LST from the archive. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
som_slurp_armap (abfd)
|
som_slurp_armap (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
@@ -5824,6 +5815,7 @@ som_bfd_prep_for_ar_write (abfd, num_syms, stringsize)
|
|||||||
|
|
||||||
/* Hash a symbol name based on the hashing algorithm presented in the
|
/* Hash a symbol name based on the hashing algorithm presented in the
|
||||||
SOM ABI. */
|
SOM ABI. */
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
som_bfd_ar_symbol_hash (symbol)
|
som_bfd_ar_symbol_hash (symbol)
|
||||||
asymbol *symbol;
|
asymbol *symbol;
|
||||||
@@ -5835,7 +5827,7 @@ som_bfd_ar_symbol_hash (symbol)
|
|||||||
return 0x1000100 | (symbol->name[0] << 16) | symbol->name[0];
|
return 0x1000100 | (symbol->name[0] << 16) | symbol->name[0];
|
||||||
|
|
||||||
return ((len & 0x7f) << 24) | (symbol->name[1] << 16)
|
return ((len & 0x7f) << 24) | (symbol->name[1] << 16)
|
||||||
| (symbol->name[len-2] << 8) | symbol->name[len-1];
|
| (symbol->name[len - 2] << 8) | symbol->name[len - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do the bulk of the work required to write the SOM library
|
/* Do the bulk of the work required to write the SOM library
|
||||||
@@ -6027,7 +6019,7 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst, elength)
|
|||||||
p += 4;
|
p += 4;
|
||||||
strcpy (p, sym->symbol.name);
|
strcpy (p, sym->symbol.name);
|
||||||
p += strlen (sym->symbol.name) + 1;
|
p += strlen (sym->symbol.name) + 1;
|
||||||
while ((int)p % 4)
|
while ((int) p % 4)
|
||||||
{
|
{
|
||||||
bfd_put_8 (abfd, 0, p);
|
bfd_put_8 (abfd, 0, p);
|
||||||
p++;
|
p++;
|
||||||
@@ -6100,7 +6092,6 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst, elength)
|
|||||||
|
|
||||||
You'll never believe this is really how armaps are handled in SOM... */
|
You'll never believe this is really how armaps are handled in SOM... */
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
static boolean
|
static boolean
|
||||||
som_write_armap (abfd, elength, map, orl_count, stridx)
|
som_write_armap (abfd, elength, map, orl_count, stridx)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
@@ -6187,9 +6178,9 @@ som_write_armap (abfd, elength, map, orl_count, stridx)
|
|||||||
|
|
||||||
/* Compute the checksum. Must happen after the entire lst header
|
/* Compute the checksum. Must happen after the entire lst header
|
||||||
has filled in. */
|
has filled in. */
|
||||||
p = (int *)&lst;
|
p = (int *) &lst;
|
||||||
lst.checksum = 0;
|
lst.checksum = 0;
|
||||||
for (i = 0; i < sizeof (struct lst_header)/sizeof (int) - 1; i++)
|
for (i = 0; i < sizeof (struct lst_header) / sizeof (int) - 1; i++)
|
||||||
lst.checksum ^= *p++;
|
lst.checksum ^= *p++;
|
||||||
|
|
||||||
sprintf (hdr.ar_name, "/ ");
|
sprintf (hdr.ar_name, "/ ");
|
||||||
@@ -6257,6 +6248,7 @@ som_bfd_free_cached_info (abfd)
|
|||||||
/* End of miscellaneous support functions. */
|
/* End of miscellaneous support functions. */
|
||||||
|
|
||||||
/* Linker support functions. */
|
/* Linker support functions. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
som_bfd_link_split_section (abfd, sec)
|
som_bfd_link_split_section (abfd, sec)
|
||||||
bfd *abfd ATTRIBUTE_UNUSED;
|
bfd *abfd ATTRIBUTE_UNUSED;
|
||||||
@@ -6294,8 +6286,7 @@ som_bfd_link_split_section (abfd, sec)
|
|||||||
|
|
||||||
#define som_bfd_gc_sections bfd_generic_gc_sections
|
#define som_bfd_gc_sections bfd_generic_gc_sections
|
||||||
|
|
||||||
const bfd_target som_vec =
|
const bfd_target som_vec = {
|
||||||
{
|
|
||||||
"som", /* name */
|
"som", /* name */
|
||||||
bfd_target_som_flavour,
|
bfd_target_som_flavour,
|
||||||
BFD_ENDIAN_BIG, /* target byte order */
|
BFD_ENDIAN_BIG, /* target byte order */
|
||||||
|
|||||||
Reference in New Issue
Block a user