This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[aida_s@mx12.freecom.ne.jp: A serious bug of "ld --enable-auto-import"]
- To: binutils at sources dot redhat dot com
- Subject: [aida_s@mx12.freecom.ne.jp: A serious bug of "ld --enable-auto-import"]
- From: Christopher Faylor <cgf at redhat dot com>
- Date: Sat, 25 Aug 2001 13:50:48 -0400
----- Forwarded message from AIDA Shinra <aida_s@mx12.freecom.ne.jp> -----
From: "AIDA Shinra" <aida_s@mx12.freecom.ne.jp>
To: <cygwin@cygwin.com>
Subject: A serious bug of "ld --enable-auto-import"
Date: Fri, 24 Aug 2001 16:44:51 +0900
I found a bug of ld(included in binutils 20010802-1).
Following is a simple test program.
----hello.c----
#include <stdio.h>
extern char hwstr1[];
extern char hwstr2[];
int main(void){
char *p;
hwstr1[12]='!';
p=hwstr2;
p[12]='!';
puts(hwstr1);
puts(hwstr2);
return 0;
}
----hwstr.c----
char hwstr1[]="Hello, World?";
char hwstr2[]="Hello, World?";
----Makefile----
CC = gcc
CFLAGS = -g -Wall -save-temps
LDFLAGS = -Wl,--enable-auto-import
DLL_LDFLAGS = -Wl,--export-all-symbols -Wl,-enable-auto-image-base \
-Wl,--enable-auto-import
.c.o:
gcc -c $(CFLAGS) -o $@ $<
all: hello.exe
cyghwstr.dll libhwstr.dll.a: hwstr.o
gcc -shared -Wl,--out-implib=libhwstr.dll.a $(DLL_LDFLAGS) \
-o cyghwstr.dll hwstr.o
hello.exe: hello.o cyghwstr.dll libhwstr.dll.a
$(CC) $(LDFLAGS) -o hello.exe hello.o -L. -lhwstr
clean:
rm -f hello.exe cyghwstr.dll libhwstr.dll.a *.o *.s *.i
--------
Of course, the correct result of "./hello" is like this:
Hello, World!
Hello, World!
But I got a result like this:
!ello, World?
Hello, World!
This probrem is seemed to be caused by a bug of the linker,
not the compiler. See this:
--summury of hello.s--
_main:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
.stabn 68,0,5,LM1-_main
LM1:
call ___main
.stabn 68,0,6,LM2-_main
LM2:
LBB2:
.stabn 68,0,8,LM3-_main
LM3:
movb $33,_hwstr1+12
.stabn 68,0,9,LM4-_main
LM4:
movl $_hwstr2,-4(%ebp)
.stabn 68,0,10,LM5-_main
LM5:
movl -4(%ebp),%eax
addl $12,%eax
movb $33,(%eax)
.stabn 68,0,11,LM6-_main
LM6:
addl $-12,%esp
pushl $_hwstr1
call _puts
addl $16,%esp
.stabn 68,0,12,LM7-_main
LM7:
addl $-12,%esp
pushl $_hwstr2
call _puts
addl $16,%esp
.stabn 68,0,13,LM8-_main
LM8:
xorl %eax,%eax
jmp L10
.stabn 68,0,14,LM9-_main
LM9:
LBE2:
.stabn 68,0,14,LM10-_main
LM10:
.align 4
L10:
movl %ebp,%esp
popl %ebp
ret
--------
At least the compilation seemes to be succeeded.
In addition, when I used "__declspec(dllimport)" instead of
"-Wl,--enable-auto-import", I got the correct result.
AIDA Shinra
----- End forwarded message -----