mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 02:24:17 +08:00
bfd/
* elf32-ppc.c (ppc_elf_begin_write_processing): Allow empty apuinfo sections, only scan input sections once and reuse the buffer. ld/testsuite/ * ld-powerpc/apuinfo-nul.s: New. * ld-powerpc/apuinfo.rd: Add it. * ld-powerpc/powerpc.exp: Likewise.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2010-02-08 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
* elf32-ppc.c (ppc_elf_begin_write_processing): Allow empty
|
||||||
|
apuinfo sections, only scan input sections once and reuse the
|
||||||
|
buffer.
|
||||||
|
|
||||||
2010-02-08 Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
|
2010-02-08 Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
|
||||||
|
|
||||||
* archures.c (bfd_mach_ppc_titan): Define.
|
* archures.c (bfd_mach_ppc_titan): Define.
|
||||||
|
@ -9831,7 +9831,8 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
|
|||||||
{
|
{
|
||||||
_bfd_error_handler
|
_bfd_error_handler
|
||||||
(_("error: %B uses VFP register arguments, %B does not"),
|
(_("error: %B uses VFP register arguments, %B does not"),
|
||||||
ibfd, obfd);
|
in_attr[Tag_ABI_VFP_args].i ? ibfd : obfd,
|
||||||
|
in_attr[Tag_ABI_VFP_args].i ? obfd : ibfd);
|
||||||
result = FALSE;
|
result = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2159,123 +2159,92 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
|
|||||||
{
|
{
|
||||||
bfd *ibfd;
|
bfd *ibfd;
|
||||||
asection *asec;
|
asection *asec;
|
||||||
char *buffer;
|
char *buffer = NULL;
|
||||||
unsigned num_input_sections;
|
bfd_size_type largest_input_size = 0;
|
||||||
bfd_size_type output_section_size;
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
unsigned num_entries;
|
unsigned num_entries;
|
||||||
unsigned long offset;
|
|
||||||
unsigned long length;
|
unsigned long length;
|
||||||
const char *error_message = NULL;
|
const char *error_message = NULL;
|
||||||
|
|
||||||
if (link_info == NULL)
|
if (link_info == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Scan the input bfds, looking for apuinfo sections. */
|
|
||||||
num_input_sections = 0;
|
|
||||||
output_section_size = 0;
|
|
||||||
|
|
||||||
for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
|
|
||||||
{
|
|
||||||
asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
|
|
||||||
if (asec)
|
|
||||||
{
|
|
||||||
++ num_input_sections;
|
|
||||||
output_section_size += asec->size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We need at least one input sections
|
|
||||||
in order to make merging worthwhile. */
|
|
||||||
if (num_input_sections < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Just make sure that the output section exists as well. */
|
|
||||||
asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
|
|
||||||
if (asec == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Allocate a buffer for the contents of the input sections. */
|
|
||||||
buffer = bfd_malloc (output_section_size);
|
|
||||||
if (buffer == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
offset = 0;
|
|
||||||
apuinfo_list_init ();
|
apuinfo_list_init ();
|
||||||
|
|
||||||
/* Read in the input sections contents. */
|
/* Read in the input sections contents. */
|
||||||
for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
|
for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
|
||||||
{
|
{
|
||||||
unsigned long datum;
|
unsigned long datum;
|
||||||
char *ptr;
|
|
||||||
|
|
||||||
asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
|
asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
|
||||||
if (asec == NULL)
|
if (asec == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
error_message = _("corrupt %s section in %B");
|
||||||
length = asec->size;
|
length = asec->size;
|
||||||
if (length < 24)
|
if (length < 20)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (largest_input_size < asec->size)
|
||||||
{
|
{
|
||||||
error_message = _("corrupt or empty %s section in %B");
|
if (buffer)
|
||||||
goto fail;
|
free (buffer);
|
||||||
|
largest_input_size = asec->size;
|
||||||
|
buffer = bfd_malloc (largest_input_size);
|
||||||
|
if (!buffer)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
|
if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
|
||||||
|| (bfd_bread (buffer + offset, length, ibfd) != length))
|
|| (bfd_bread (buffer, length, ibfd) != length))
|
||||||
{
|
{
|
||||||
error_message = _("unable to read in %s section from %B");
|
error_message = _("unable to read in %s section from %B");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process the contents of the section. */
|
|
||||||
ptr = buffer + offset;
|
|
||||||
error_message = _("corrupt %s section in %B");
|
|
||||||
|
|
||||||
/* Verify the contents of the header. Note - we have to
|
/* Verify the contents of the header. Note - we have to
|
||||||
extract the values this way in order to allow for a
|
extract the values this way in order to allow for a
|
||||||
host whose endian-ness is different from the target. */
|
host whose endian-ness is different from the target. */
|
||||||
datum = bfd_get_32 (ibfd, ptr);
|
datum = bfd_get_32 (ibfd, buffer);
|
||||||
if (datum != sizeof APUINFO_LABEL)
|
if (datum != sizeof APUINFO_LABEL)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
datum = bfd_get_32 (ibfd, ptr + 8);
|
datum = bfd_get_32 (ibfd, buffer + 8);
|
||||||
if (datum != 0x2)
|
if (datum != 0x2)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
|
if (strcmp (buffer + 12, APUINFO_LABEL) != 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* Get the number of bytes used for apuinfo entries. */
|
/* Get the number of bytes used for apuinfo entries. */
|
||||||
datum = bfd_get_32 (ibfd, ptr + 4);
|
datum = bfd_get_32 (ibfd, buffer + 4);
|
||||||
if (datum + 20 != length)
|
if (datum + 20 != length)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* Make sure that we do not run off the end of the section. */
|
|
||||||
if (offset + length > output_section_size)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
/* Scan the apuinfo section, building a list of apuinfo numbers. */
|
/* Scan the apuinfo section, building a list of apuinfo numbers. */
|
||||||
for (i = 0; i < datum; i += 4)
|
for (i = 0; i < datum; i += 4)
|
||||||
apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
|
apuinfo_list_add (bfd_get_32 (ibfd, buffer + 20 + i));
|
||||||
|
|
||||||
/* Update the offset. */
|
|
||||||
offset += length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
error_message = NULL;
|
error_message = NULL;
|
||||||
|
|
||||||
/* Compute the size of the output section. */
|
/* Compute the size of the output section. */
|
||||||
num_entries = apuinfo_list_length ();
|
num_entries = apuinfo_list_length ();
|
||||||
output_section_size = 20 + num_entries * 4;
|
|
||||||
|
|
||||||
asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
|
if (num_entries)
|
||||||
|
{
|
||||||
if (! bfd_set_section_size (abfd, asec, output_section_size))
|
/* Set the output section size, if it exists. */
|
||||||
ibfd = abfd,
|
asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
|
||||||
error_message = _("warning: unable to set size of %s section in %B");
|
if (asec && ! bfd_set_section_size (abfd, asec, 20 + num_entries * 4))
|
||||||
|
{
|
||||||
|
ibfd = abfd;
|
||||||
|
error_message = _("warning: unable to set size of %s section in %B");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
free (buffer);
|
if (buffer)
|
||||||
|
free (buffer);
|
||||||
|
|
||||||
if (error_message)
|
if (error_message)
|
||||||
(*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
|
(*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
|
2010-02-08 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
* ld-powerpc/apuinfo-nul.s: New.
|
||||||
|
* ld-powerpc/apuinfo.rd: Add it.
|
||||||
|
* ld-powerpc/powerpc.exp: Likewise.
|
||||||
|
|
||||||
2010-02-01 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
|
2010-02-01 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
|
||||||
|
|
||||||
* ld-arm/jump-reloc-veneers-long.d: New test.
|
* ld-arm/jump-reloc-veneers-long.d: New test.
|
||||||
* ld-arm/jump-reloc-veneers-short1.d: Likewise.
|
* ld-arm/jump-reloc-veneers-short1.d: Likewise.
|
||||||
* ld-arm/jump-reloc-veneers-short2.d: Likewise.
|
* ld-arm/jump-reloc-veneers-short2.d: Likewise.
|
||||||
* ld-arm/jump-reloc-veneers.s: Likewise.
|
* ld-arm/jump-reloc-veneers.s: Likewise.
|
||||||
* ld-arm/arm-elf.exp (armelftests): Run them.
|
* ld-arm/arm-elf.exp (armelftests): Run them.
|
||||||
|
|
||||||
2010-01-28 Nick Clifton <nickc@redhat.com>
|
2010-01-28 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
10
ld/testsuite/ld-powerpc/apuinfo-nul.s
Normal file
10
ld/testsuite/ld-powerpc/apuinfo-nul.s
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.text
|
||||||
|
nop
|
||||||
|
|
||||||
|
# dummy empty apuinfo
|
||||||
|
# some other tools emit these
|
||||||
|
.section ".PPC.EMB.apuinfo"
|
||||||
|
.long 8
|
||||||
|
.long 0
|
||||||
|
.long 2
|
||||||
|
.asciz "APUinfo"
|
@ -1,5 +1,6 @@
|
|||||||
#source: apuinfo1.s
|
#source: apuinfo1.s
|
||||||
#source: apuinfo2.s
|
#source: apuinfo2.s
|
||||||
|
#source: apuinfo-nul.s
|
||||||
#as: -me500
|
#as: -me500
|
||||||
#readelf: -x2
|
#readelf: -x2
|
||||||
#target: powerpc-eabi*
|
#target: powerpc-eabi*
|
||||||
|
@ -101,7 +101,7 @@ set ppcelftests {
|
|||||||
{"Reloc section order" "-melf32ppc -shared -z nocombreloc" "-a32" {reloc.s}
|
{"Reloc section order" "-melf32ppc -shared -z nocombreloc" "-a32" {reloc.s}
|
||||||
{{objdump -hw reloc.d}} "reloc.so"}
|
{{objdump -hw reloc.d}} "reloc.so"}
|
||||||
{"APUinfo section processing" "-melf32ppc"
|
{"APUinfo section processing" "-melf32ppc"
|
||||||
"-a32 -me500" {apuinfo1.s apuinfo2.s}
|
"-a32 -me500" {apuinfo1.s apuinfo-nul.s apuinfo2.s}
|
||||||
{{readelf -x2 apuinfo.rd}} "apuinfo"}
|
{{readelf -x2 apuinfo.rd}} "apuinfo"}
|
||||||
{"TLS32 static exec" "-melf32ppc" "-a32" {tls32.s tlslib32.s}
|
{"TLS32 static exec" "-melf32ppc" "-a32" {tls32.s tlslib32.s}
|
||||||
{{objdump -dr tls32.d} {objdump -sj.got tls32.g}
|
{{objdump -dr tls32.d} {objdump -sj.got tls32.g}
|
||||||
|
Reference in New Issue
Block a user