aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2004-09-24 03:13:01 +0000
committerAlan Modra <amodra@gmail.com>2004-09-24 03:13:01 +0000
commit5efb626185b9820d357696c1ade63ec19b24a80d (patch)
tree980b4b2530462b7c0c1a02952573143bb330c9af
parent315b3b02cfd1467b6e10bb0a0e4f2e25bba10390 (diff)
downloadgdb-5efb626185b9820d357696c1ade63ec19b24a80d.zip
gdb-5efb626185b9820d357696c1ade63ec19b24a80d.tar.gz
gdb-5efb626185b9820d357696c1ade63ec19b24a80d.tar.bz2
* elf.c (IS_LOADED): Delete.
(assign_file_positions_for_segments): Just test SEC_LOAD instead. Restore SEC_HAS_CONTENTS test to the one place it was used prior to 2004-09-22.
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf.c29
2 files changed, 26 insertions, 10 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 842e7d9..8537513 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2004-09-24 Alan Modra <amodra@bigpond.net.au>
+
+ * elf.c (IS_LOADED): Delete.
+ (assign_file_positions_for_segments): Just test SEC_LOAD instead.
+ Restore SEC_HAS_CONTENTS test to the one place it was used prior
+ to 2004-09-22.
+
2004-09-23 Alan Modra <amodra@bigpond.net.au>
PR gas/396
diff --git a/bfd/elf.c b/bfd/elf.c
index 2b73cde..64990b2b 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3787,12 +3787,6 @@ vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
return ((vma - off) % maxpagesize);
}
-/* We check SEC_HAS_CONTENTS here because if NOLOAD is used in a linker
- script we may have a section with SEC_LOAD clear but which is
- supposed to have contents. */
-#define IS_LOADED(FLAGS) \
- (((FLAGS) & SEC_LOAD) != 0 || ((FLAGS) & SEC_HAS_CONTENTS) != 0)
-
/* Assign file positions to the sections based on the mapping from
sections to segments. This function also sets up some fields in
the file header, and writes out the program headers. */
@@ -3959,7 +3953,7 @@ assign_file_positions_for_segments (bfd *abfd, struct bfd_link_info *link_info)
.tbss, we need to look at the next section to decide
whether the segment has any loadable sections. */
i = 0;
- while (!IS_LOADED (m->sections[i]->flags))
+ while ((m->sections[i]->flags & SEC_LOAD) == 0)
{
if ((m->sections[i]->flags & SEC_THREAD_LOCAL) == 0
|| ++i >= m->count)
@@ -4107,7 +4101,7 @@ assign_file_positions_for_segments (bfd *abfd, struct bfd_link_info *link_info)
{
bfd_signed_vma adjust;
- if (IS_LOADED (flags))
+ if ((flags & SEC_LOAD) != 0)
{
adjust = sec->lma - (p->p_paddr + p->p_filesz);
if (adjust < 0)
@@ -4164,11 +4158,26 @@ assign_file_positions_for_segments (bfd *abfd, struct bfd_link_info *link_info)
if (p->p_type == PT_LOAD)
{
sec->filepos = off;
- if (IS_LOADED (flags))
+ /* FIXME: The SEC_HAS_CONTENTS test here dates back to
+ 1997, and the exact reason for it isn't clear. One
+ plausible explanation is that it is to work around
+ a problem we have with linker scripts using data
+ statements in NOLOAD sections. I don't think it
+ makes a great deal of sense to have such a section
+ assigned to a PT_LOAD segment, but apparently
+ people do this. The data statement results in a
+ bfd_data_link_order being built, and these need
+ section contents to write into. Eventually, we get
+ to _bfd_elf_write_object_contents which writes any
+ section with contents to the output. Make room
+ here for the write, so that following segments are
+ not trashed. */
+ if ((flags & SEC_LOAD) != 0
+ || (flags & SEC_HAS_CONTENTS) != 0)
off += sec->size;
}
- if (IS_LOADED (flags))
+ if ((flags & SEC_LOAD) != 0)
{
p->p_filesz += sec->size;
p->p_memsz += sec->size;