summaryrefslogtreecommitdiff
path: root/bfd/elf32-ppc.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2010-04-01 10:02:27 +0000
committerNathan Sidwell <nathan@codesourcery.com>2010-04-01 10:02:27 +0000
commit70106466464e05c89403fe47fff8328adf621702 (patch)
tree0abce2007351c9fa998d8cfd5284b4a4ed9b2088 /bfd/elf32-ppc.c
parent053dc88b3991f981f5b0611ea2dc1463e4f584fc (diff)
downloadbinutils-redhat-70106466464e05c89403fe47fff8328adf621702.tar.gz
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.
Diffstat (limited to 'bfd/elf32-ppc.c')
-rw-r--r--bfd/elf32-ppc.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 2c42464ee9..28274c4043 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;