Subject: Linking problems
From: [email-masked] (Jon Thackray)

7 Jul 1997 07:39:39 -0700
Approved: [email-masked]
Distribution: cygnus
Message-ID: <[email-masked]>
Original-To: [email-masked]
Original-Sender: [email-masked]

I am still having problem using ld to produce working dlls. I have
converted the .lib files I wish to link against into .a files using
dlltool (and using nm to create the .def file). However, when I try to
link to produce another dll, I find the dll I get is missing its
..rdata, .idata and .reloc sections. It also doesn't seem to work very
well. I append the linker script and ld command line I used. Here's
what objdump thinks of the result, which was produced without error by
ld.

C:\dyl>objdump --headers threads.dll

threads.dll:     file format pei-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000200  00401000  000000fd  000002b8  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, CODE
  1 .dyvar        00000200  00402000  00000004  000004b8  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .dyfix        00000200  00403000  0000000b  000006b8  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, DATA

And here's what I think objdump should have produced, or something
like it (this was produced by link).

C:\dyl>objdump --headers j:/releases\pentium-kan/install\x86-win32\bin\threads.dll

j:/releases\pentium-kan/install\x86-win32\bin\threads.dll:     file format pei-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000200  10001000  00000154  00000400  2**2
                  CONTENTS, ALLOC, LOAD, CODE
  1 .rdata        00000200  10002000  00000126  00000600  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .idata        00000400  10003000  000002c8  00000800  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  3 .dyvar        00000200  10004000  00000004  00000c00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  4 .dyfix        00000200  10005000  0000000b  00000e00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  5 .reloc        00000200  10006000  00000074  00001000  2**2
                  CONTENTS, ALLOC, LOAD, DATA

Finally, here's the link command and script.

ld -T i386pe.scr -r -E -e _DylanDllEntry@12 -o threads.dll --traditional-format -L. -ldylan j:/releases/pentium-kan/build/x86-win32/threads/_glue.obj j:/releases/pentium-kan/build/x86-win32/threads/threads-library.obj j:/releases/pentium-kan/lib/pentium-run-time/dylan-support.obj

OUTPUT_FORMAT(pei-i386)
TARGET(pe-i386)
SECTIONS
{
  .text  __image_base__ + __section_alignment__  : 
  {
     *(.init)
    *(.text)
     ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; 
			LONG (-1); *(.ctors); *(.ctor); LONG (0); 
     ___DTOR_LIST__ = .; __DTOR_LIST__ = . ; 
			LONG (-1); *(.dtors); *(.dtor);  LONG (0); 
     *(.fini)
    /* ??? Why is .gcc_exc here?  */
     *(.gcc_exc)
     etext = .;
    /* Grouped section support currently must be explicitly provided for
	in the linker script.  */
    *(.text$)
  }
  .bss BLOCK(__section_alignment__)  :
  {
    __bss_start__ = . ;
    *(.bss)
    *(COMMON)
    __bss_end__ = . ;
  }
  .data BLOCK(__section_alignment__) : 
  {
    __data_start__ = . ; 
    *(.data)
    *(.data2)
    __data_end__ = . ; 
    /* Grouped section support currently must be explicitly provided for
	in the linker script.  */
    *(.data$)
  }
  .rdata BLOCK(__section_alignment__) :
  {
    *(.rdata)
    /* Grouped section support currently must be explicitly provided for
	in the linker script.  */
    *(.rdata$)
  }
  .edata BLOCK(__section_alignment__) :
  {
    *(.edata)
  }
  .dydat BLOCK(0x1000) :
  {
    *(.dydat$a)
    *(.dydat$m)
    *(.dydat$z)
  }
  .dyobj BLOCK(0x1000) :
  {
    *(.dyobj$a)
    *(.dyobj$m)
    *(.dyobj$z)
  }
  .dyvar BLOCK(0x1000) :
  {
    *(.dyvar$a)
    *(.dyvar$m)
    *(.dyvar$z)
  }
  .dyfix BLOCK(0x1000) :
  {
    *(.dyfix$a)
    *(.dyfix$m)
    *(.dyfix$z)
  }
  /DISCARD/ :
  {
    *(.debug$S)
    *(.debug$T)
    *(.debug$F)
    *(.drectve)
  }
  .idata BLOCK(__section_alignment__) :
  {
    /* This cannot currently be handled with grouped sections.
	See pe.em:sort_sections.  */
    *(.idata$2)
    *(.idata$3)
    *(.idata$4)
    *(.idata$5)
    *(.idata$6)
    *(.idata$7)
  }
  .CRT BLOCK(__section_alignment__) :
  { 					
    /* Grouped sections are used to handle .CRT$foo.  */
    *(.CRT$)
  }
  .tls BLOCK(__section_alignment__) :
  { 					
    *(.tls$)
    ;
  }
  .rsrc BLOCK(__section_alignment__) :
  { 					
    /* Grouped sections are used to handle .rsrc$0[12].  */
    *(.rsrc$)
  }
  .endjunk BLOCK(__section_alignment__) :
  {
    /* end is deprecated, don't use it */
     end = .;
     __end__ = .;
  }
  .stab BLOCK(__section_alignment__)  (NOLOAD) : 
  {
    [ .stab ]
  }
  .stabstr BLOCK(__section_alignment__) (NOLOAD) :
  {
    [ .stabstr ]
  }
  .reloc BLOCK(__section_alignment__) :
  { 					
    *(.reloc)
  }
}
------- end -------
-
For help on using this list (especially unsubscribing), send a message to
"[email-masked]" with one line of text: "help".