aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/bfd-in2.h10
-rw-r--r--bfd/coffcode.h26
-rw-r--r--bfd/coffgen.c7
-rw-r--r--bfd/section.c10
-rw-r--r--binutils/ChangeLog4
-rw-r--r--binutils/objdump.c2
7 files changed, 63 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 78b62c6..d9a8ee8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2000-04-06 Timothy Wall <twall@cygnus.com>
+
+ * coffcode.h (coff_slurp_symbol_table): Handle C_STATLAB storage
+ class. Handle SEC_CLINK and SEC_BLOCK flags.
+ * section.c: Add SEC_CLINK and SEC_BLOCK flags.
+ * bfd-in2.h: Add SEC_CLINK and SEC_BLOCK flags.
+
2000-04-06 Nick Clifton <nickc@cygnus.com>
* elf32-arm.h (elf32_arm_set_private_flags): Only check for
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index abbf203..68e2db5 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1057,6 +1057,16 @@ typedef struct sec
executables or shared objects. */
#define SEC_SHARED 0x4000000
+ /* When a section with this flag is being linked, then if the size of
+ the input section is less than a page, it should not cross a page
+ boundary. If the size of the input section is one page or more, it
+ should be aligned on a page boundary. */
+#define SEC_BLOCK 0x8000000
+
+ /* Conditionally link this section; do not link if there are no
+ references found to any symbol in the section. */
+#define SEC_CLINK 0x10000000
+
/* End of section flags. */
/* Some internal packed boolean fields. */
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 8193a21..c635d33 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -436,6 +436,16 @@ sec_to_styp_flags (sec_name, sec_flags)
styp_flags = STYP_BSS;
}
+#ifdef STYP_CLINK
+ if (sec_flags & SEC_CLINK)
+ styp_flags |= STYP_CLINK;
+#endif
+
+#ifdef STYP_BLOCK
+ if (sec_flags & SEC_BLOCK)
+ styp_flags |= STYP_BLOCK;
+#endif
+
#ifdef STYP_NOLOAD
if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
styp_flags |= STYP_NOLOAD;
@@ -533,6 +543,16 @@ styp_to_sec_flags (abfd, hdr, name, section)
long styp_flags = internal_s->s_flags;
flagword sec_flags = 0;
+#ifdef STYP_BLOCK
+ if (styp_flags & STYP_BLOCK)
+ sec_flags |= SEC_BLOCK;
+#endif
+
+#ifdef STYP_CLINK
+ if (styp_flags & STYP_CLINK)
+ sec_flags |= SEC_CLINK;
+#endif
+
#ifdef STYP_NOLOAD
if (styp_flags & STYP_NOLOAD)
{
@@ -4304,6 +4324,11 @@ coff_slurp_symbol_table (abfd)
#endif
break;
+ case C_STATLAB: /* Static load time label */
+ dst->symbol.value = src->u.syment.n_value;
+ dst->symbol.flags = BSF_GLOBAL;
+ break;
+
case C_NULL:
/* PE DLLs sometimes have zeroed out symbols for some
reason. Just ignore them without a warning. */
@@ -4326,7 +4351,6 @@ coff_slurp_symbol_table (abfd)
#ifdef TIC80COFF
case C_UEXT: /* Tentative external definition */
#endif
- case C_STATLAB: /* Static load time label */
case C_EXTLAB: /* External load time label */
case C_HIDDEN: /* ext symbol in dmert public lib */
default:
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index f2410d9..47e5baa 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -608,8 +608,11 @@ fixup_symbol_value (abfd, coff_symbol_ptr, syment)
syment->n_value = (coff_symbol_ptr->symbol.value
+ coff_symbol_ptr->symbol.section->output_offset);
if (! obj_pe (abfd))
- syment->n_value +=
- coff_symbol_ptr->symbol.section->output_section->vma;
+ {
+ syment->n_value += (syment->n_sclass == C_STATLAB)
+ ? coff_symbol_ptr->symbol.section->output_section->lma
+ : coff_symbol_ptr->symbol.section->output_section->vma;
+ }
}
else
{
diff --git a/bfd/section.c b/bfd/section.c
index b3b7608..ff977fd 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -336,6 +336,16 @@ CODE_FRAGMENT
. executables or shared objects. *}
.#define SEC_SHARED 0x4000000
.
+. {* When a section with this flag is being linked, then if the size of
+. the input section is less than a page, it should not cross a page
+. boundary. If the size of the input section is one page or more, it
+. should be aligned on a page boundary. *}
+.#define SEC_BLOCK 0x8000000
+.
+. {* Conditionally link this section; do not link if there are no
+. references found to any symbol in the section. *}
+.#define SEC_CLINK 0x10000000
+.
. {* End of section flags. *}
.
. {* Some internal packed boolean fields. *}
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 2bbfef4..0b9c4ce 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,7 @@
+2000-04-06 Timothy Wall <twall@cygnus.com>
+
+ * objdump.c (dump_section_header): Print CLINK and BLOCK flags.
+
2000-04-06 Jason Merrill <jason@yorick.cygnus.com>
* readelf.c (decode_location_expression): Loop through multiple
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 9c83a63e..bfcc143 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -376,6 +376,8 @@ dump_section_header (abfd, section, ignored)
PF (SEC_NEVER_LOAD, "NEVER_LOAD");
PF (SEC_EXCLUDE, "EXCLUDE");
PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
+ PF (SEC_BLOCK, "BLOCK");
+ PF (SEC_CLINK, "CLINK");
PF (SEC_SMALL_DATA, "SMALL_DATA");
PF (SEC_SHARED, "SHARED");