aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog15
-rw-r--r--ld/i386coff.sc-sh46
-rw-r--r--ld/ldlang.c14
3 files changed, 47 insertions, 28 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 5a9b0b5..e652bee 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,18 @@
+Mon Oct 19 09:45:38 1992 Ian Lance Taylor (ian@cygnus.com)
+
+ * Support for i386-sysv.
+ configure.in: check for i386-*-sysv* and i386-*-sco*.
+ i386coff.sc-sh: rewrote to support SVR3 by default.
+ ldctor.c (find_constructors): preserve stat_ptr.
+ ldlang.c (wild_doit): initialize vma and size of new output
+ section to corresponding input section. This is required for
+ shared library support.
+ (lang_size_sections): don't modify vma and size of sections which
+ are never loaded (for shared libraries).
+ ldwrite.c (copy_and_relocate): copy the contents of any section
+ which has contents, not just sections which are loaded (for shared
+ libraries).
+
Thu Oct 15 15:20:26 1992 Steve Chamberlain (sac@thepub.cygnus.com)
* ldlang.c (size_input_section): count the sizes of all sections
diff --git a/ld/i386coff.sc-sh b/ld/i386coff.sc-sh
index 485f3bb..d18fd24 100644
--- a/ld/i386coff.sc-sh
+++ b/ld/i386coff.sc-sh
@@ -1,39 +1,29 @@
-# This is totally made up, from the a29k stuff. If you know better,
-# tell us about it.
+# Linker script for 386 COFF. This works on SVR3.2 and SCO Unix 3.2.2.
+# .data2 handles SCO, which uses two data sections.
+# Ian Taylor <ian@cygnus.com>.
cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
${LIB_SEARCH_DIRS}
-MEMORY {
- text : ORIGIN = 0x1000000, LENGTH = 0x1000000
- talias : ORIGIN = 0x2000000, LENGTH = 0x1000000
- data : ORIGIN = 0x3000000, LENGTH = 0x1000000
- mstack : ORIGIN = 0x4000000, LENGTH = 0x1000000
- rstack : ORIGIN = 0x5000000, LENGTH = 0x1000000
-}
+ENTRY(_start)
+
SECTIONS
{
- .text : {
+ .text ${RELOCATING+ SIZEOF_HEADERS} : {
+ *(.init)
*(.text)
- ${RELOCATING+ _etext = .};
- *(.lit)
- *(.shdata)
- } ${RELOCATING+ > text}
- .shbss SIZEOF(.text) + ADDR(.text) : {
- *(.shbss)
- }
- .talias : { } ${RELOCATING+ > talias}
- .data : {
- *(.data)
- ${RELOCATING+ _edata = .};
- } ${RELOCATING+ > data}
- .bss SIZEOF(.data) + ADDR(.data) :
+ *(.fini)
+ ${RELOCATING+ etext = .};
+ }
+ .data ${RELOCATING+ 0x400000 + (. & 0xffc00fff)} : {
+ *(.data .data2)
+ ${RELOCATING+ edata = .};
+ }
+ .bss ${RELOCATING+ SIZEOF(.data) + ADDR(.data)} :
{
- *(.bss)
- *(COMMON)
- ${RELOCATING+ _end = ALIGN(0x8)};
+ *(.bss)
+ *(COMMON)
+ ${RELOCATING+ end = .};
}
- .mstack : { } ${RELOCATING+ > mstack}
- .rstack : { } ${RELOCATING+ > rstack}
}
EOF
diff --git a/ld/ldlang.c b/ld/ldlang.c
index ed152ab..a968dd0 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -591,6 +591,15 @@ DEFUN (wild_doit, (ptr, section, output, file),
if (output->bfd_section == (asection *) NULL)
{
init_os (output);
+ /* Initialize the vma and size to the existing section. This will
+ be overriden in lang_size_sections unless SEC_NEVER_LOAD gets
+ set. */
+ if (section != (asection *) NULL)
+ {
+ bfd_set_section_vma (0, output->bfd_section,
+ bfd_section_vma (0, section));
+ output->bfd_section->_raw_size = section->_raw_size;
+ }
}
if (section != (asection *) NULL
@@ -1486,6 +1495,11 @@ DEFUN (lang_size_sections, (s, output_section_statement, prev, fill,
bfd_vma after;
lang_output_section_statement_type *os = &s->output_section_statement;
+ /* If this section is never loaded, don't change the size and
+ address. */
+ if (os->bfd_section->flags & SEC_NEVER_LOAD)
+ break;
+
if (os->bfd_section == &bfd_abs_section)
{
/* No matter what happens, an abs section starts at zero */