From f2faa8006cc51cebefb638ea285b1202ebf2ee71 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 1 Apr 2010 10:02:28 +0000 Subject: [PATCH] bfd/ * elf32-ppc.c (apuinfo_set): New static var. (ppc_elf_begin_write_processing): Set it here, always create an APUinfo section if there were any in the inputs. (ppc_elf_write_section): Check apuinfo_set. (ppc_elf_final_write_processing): Likewise. ld/testsuite/ * ld-powerpc/apuinfo-nul.rd: New. * ld-powerpc/apuinfo-nul1.s: New. * ld-powerpc/powerpc.exp: Add it. --- bfd/ChangeLog | 8 ++++++++ bfd/elf32-ppc.c | 19 ++++++++++--------- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-powerpc/apuinfo-nul.rd | 9 +++++++++ ld/testsuite/ld-powerpc/apuinfo-nul1.s | 10 ++++++++++ ld/testsuite/ld-powerpc/powerpc.exp | 3 +++ 6 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 ld/testsuite/ld-powerpc/apuinfo-nul.rd create mode 100644 ld/testsuite/ld-powerpc/apuinfo-nul1.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index de1ed790eb0..aa3214496d1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2010-04-01 Nathan Sidwell + + * elf32-ppc.c (apuinfo_set): New static var. + (ppc_elf_begin_write_processing): Set it here, always create an + APUinfo section if there were any in the inputs. + (ppc_elf_write_section): Check apuinfo_set. + (ppc_elf_final_write_processing): Likewise. + 2010-04-01 Tristan Gingold * vms.h: Include time.h. Add prototypes for vms_get_module_name, diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 2c42464ee9d..28274c40437 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -2077,12 +2077,13 @@ typedef struct apuinfo_list apuinfo_list; static apuinfo_list *head; - +static bfd_boolean apuinfo_set; static void apuinfo_list_init (void) { head = NULL; + apuinfo_set = FALSE; } static void @@ -2162,7 +2163,6 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info) char *buffer = NULL; bfd_size_type largest_input_size = 0; unsigned i; - unsigned num_entries; unsigned long length; const char *error_message = NULL; @@ -2185,6 +2185,7 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info) if (length < 20) goto fail; + apuinfo_set = TRUE; if (largest_input_size < asec->size) { if (buffer) @@ -2228,13 +2229,14 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info) error_message = NULL; - /* Compute the size of the output section. */ - num_entries = apuinfo_list_length (); - - if (num_entries) + if (apuinfo_set) { + /* Compute the size of the output section. */ + unsigned num_entries = apuinfo_list_length (); + /* Set the output section size, if it exists. */ asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME); + if (asec && ! bfd_set_section_size (abfd, asec, 20 + num_entries * 4)) { ibfd = abfd; @@ -2259,8 +2261,7 @@ ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED, asection *asec, bfd_byte *contents ATTRIBUTE_UNUSED) { - return (apuinfo_list_length () - && strcmp (asec->name, APUINFO_SECTION_NAME) == 0); + return apuinfo_set && strcmp (asec->name, APUINFO_SECTION_NAME) == 0; } /* Finally we can generate the output section. */ @@ -2278,7 +2279,7 @@ ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) if (asec == NULL) return; - if (apuinfo_list_length () == 0) + if (!apuinfo_set) return; length = asec->size; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3731c1f14b1..97a39ec3abf 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-04-01 Nathan Sidwell + + * ld-powerpc/apuinfo-nul.rd: New. + * ld-powerpc/apuinfo-nul1.s: New. + * ld-powerpc/powerpc.exp: Add it. + 2010-03-31 Kai TIetz * ld-pe//pe-compile.exp (run_basefile_test): Trim result of wc diff --git a/ld/testsuite/ld-powerpc/apuinfo-nul.rd b/ld/testsuite/ld-powerpc/apuinfo-nul.rd new file mode 100644 index 00000000000..c20fc5e6dcf --- /dev/null +++ b/ld/testsuite/ld-powerpc/apuinfo-nul.rd @@ -0,0 +1,9 @@ +#source: apuinfo-nul.s +#source: apuinfo-nul1.s +#as: -me500 +#readelf: -x2 +#target: powerpc-eabi* + +Hex dump of section '.PPC.EMB.apuinfo': + 0x00000000 00000008 00000000 00000002 41505569 ............APUi + 0x00000010 6e666f00 nfo. diff --git a/ld/testsuite/ld-powerpc/apuinfo-nul1.s b/ld/testsuite/ld-powerpc/apuinfo-nul1.s new file mode 100644 index 00000000000..f415e710403 --- /dev/null +++ b/ld/testsuite/ld-powerpc/apuinfo-nul1.s @@ -0,0 +1,10 @@ + .text +_start: nop + + # dummy empty apuinfo + # some other tools emit these + .section ".PPC.EMB.apuinfo" + .long 8 + .long 0 + .long 2 + .asciz "APUinfo" diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp index 4c0038aecd1..9d0207f1c0c 100644 --- a/ld/testsuite/ld-powerpc/powerpc.exp +++ b/ld/testsuite/ld-powerpc/powerpc.exp @@ -103,6 +103,9 @@ set ppcelftests { {"APUinfo section processing" "-melf32ppc" "-a32 -me500" {apuinfo1.s apuinfo-nul.s apuinfo2.s} {{readelf -x2 apuinfo.rd}} "apuinfo"} + {"APUinfo NULL section processing" "-melf32ppc" + "-a32 -me500" {apuinfo-nul1.s apuinfo-nul.s} + {{readelf -x2 apuinfo-nul.rd}} "apuinfo"} {"TLS32 static exec" "-melf32ppc" "-a32" {tls32.s tlslib32.s} {{objdump -dr tls32.d} {objdump -sj.got tls32.g} {objdump -sj.tdata tls32.t}} -- 2.30.2