On Dec 12, 2006, at 4:15 AM, Simon Marlow wrote:
You haven't allayed my fears. If a Yasm-generated object file has
a special .reloc/.stab section to handle complex relocations, and
the GNU linker understands this special section, won't the MS
linker choke on it? Or are complex relocations done in the same
way by the MS tools too?
I tracked down the cause of the problem with the .comment section.
It was not caused by Yasm and will not cause a problem with the MS
tools. That said, Peter Johnson will patch Yasm for use under Mingw,
for compatibility.
You know that GHC appends an .ident pseudo-op (directive) at the end
of assembler output:
.ident "GHC 6.6"
This .ident is turned into a .comment, following the COFF
specification--the MS PE-COFF spec. says nothing about this, but
contains the same information in the define IMAGE_SCN_LNK_INFO, value
0x00000200, which is the same value as the STYP_INFO define in the
COFF spec.
According to the GAS source (in binutils/gas/config/obj-coff.c:
476-502, at http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/gas/
config/obj-coff.c?cvsroot=src), GAS normally does the same thing
for .ident pseudo-ops as Yasm: turn them into .comment sections.
Under Mingw, however, the binutils/LD does loads the .comment section
into memory (invalid for windows executable images). Rather than fix
this problem with LD, GAS outputs the .ident content as a new
subsection, ".rdata$zzz" with the proper section flags.
I also tested a Yasm-assembled file containing a complex relocation
and an .ident directive:
--- tst_reloc.s ---
.section .rodata
.align 4
.globl _tst_main_srt
_tst_main_srt:
.long 0
.text
.align 4
_tst_main_info:
.long _tst_main_srt-(_tst_main)+0
.long 0
.globl _tst_main
_tst_main:
enter $0, $0
pusha
mov (_tst_main_info+0), %eax
movl %ebp, %esp
popl %ebp
ret
.ident "tst_reloc ident"
-----------------------
and used a C wrapper for the rest:
--- print_reloc.c ---
#include <stdio.h>
unsigned int __cdecl tst_main( void );
int main(int argc, const char* argv[])
{
unsigned int addr;
addr = tst_main();
printf("Relocation address: %x\n", addr);
return 0;
}
-----------------------
The Yasm-assembled output, tst_reloc.obj did contain a .comment
section and a simple MS CL command:
cl tst_reloc.obj print_reloc.c
resulted in a good executable. Output when run:
Relocation address: dff8
Cheers,
Pete
_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc