From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Sokolovsky To: Mumit Khan , DJ Delorie , cygwin@sourceware.cygnus.com Subject: DLLs built corrupted with mingw32 hunt Date: Fri, 19 Feb 1999 11:21:00 -0000 Message-id: <18888.990219@is.lg.ua> X-SW-Source: 1999-02/msg00645.html Hello Mumit, This describes problem concerning building DLLs with mingw32 on win95, with solution, some kind of. Fact: dlls, linked with native mingw32 ld on win95 in most cases are not relocatable. The problem is in behavior of underlying lseek() (SetFilePointer() ultimately). It sure not there when cross-compiling, and I don't believe that NT has it - how could they get C2 for 3.51 with it in? External symptom is that referred dlls has garbage at the sections paddings. I send 2 samples to Mumit if he'd like to take a look at them. Here's a utility to check relocatabilty by practise: ---- #include char tempname[100]; void main(int argc,char *argv[]) { HANDLE h=0,h2=0; if (argc!=2) {printf("Usage: check-dll-reloc \n"); exit(0);} h=LoadLibrary(argv[1]); if (!h) {printf("Couldn't load image '%s' at all\n",argv[1]); exit(0);} strcpy(tempname,"dllXXXXXX"); mktemp(tempname); strcat(tempname,".dll"); printf("Copying to temp '%s'\n",tempname); CopyFile(argv[1],tempname,TRUE); h2=LoadLibrary(tempname); printf("Handles (load addrs) are: %x %x\n",h,h2); printf("Image is %srelocatable\n",h2?"":"NOT "); FreeLibrary(h); FreeLibrary(h2); DeleteFile(tempname); } ---- The problem itself is due win95 SetFilePointer(), when seeking past end of file, leaving previous medium contents in areas not explicitly written, despite POSIX saying they should be zeroed. BFD likes such seeks, so it goes. In cygwin b20 dll was introduced workaround for this, so its ld produces correct dll's. It's, however, would be nice to have mingw32 self-sufficient, so I tried to fix it. I cast aside making wrapper around lseek by analogy with cygwin because I neither like that solution nor have idea how to implement it correctly. Instead I found "bad" places in BFD and did workarounds there. Attached is patch as of bfd from cygwin b20. It's somewhat adhoc, so changes wrapped in #ifdefs. With this patch dll's are ok. (If someone has this problems and wants immediate solution, there's precompiled binary at http://ftp.is.lg.ua/pub/gnuwin32/alpha/ld-mingw32-replacement.zip . It's however an alpha effort featuring bfd as dll (required) at http://ftp.is.lg.ua/pub/gnuwin32/alpha/bfd-dll.zip and another underlying library). But strip built with patched bfd still wrecks dll off relocatability, just as cygwin b20 strip does. Best regards, Paul mailto:paul-ml@is.lg.ua coffcode.h.dif -- Want to unsubscribe from this list? Send a message to cygwin-unsubscribe@sourceware.cygnus.com From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Sokolovsky To: Mumit Khan , DJ Delorie , cygwin@sourceware.cygnus.com Subject: DLLs built corrupted with mingw32 hunt Date: Sun, 28 Feb 1999 23:02:00 -0000 Message-ID: <18888.990219@is.lg.ua> X-SW-Source: 1999-02n/msg00640.html Message-ID: <19990228230200.92-zKDdIWNDTRPCmtwAhFwx_asnNKJRJDKZ2GwkSnPA@z> Hello Mumit, This describes problem concerning building DLLs with mingw32 on win95, with solution, some kind of. Fact: dlls, linked with native mingw32 ld on win95 in most cases are not relocatable. The problem is in behavior of underlying lseek() (SetFilePointer() ultimately). It sure not there when cross-compiling, and I don't believe that NT has it - how could they get C2 for 3.51 with it in? External symptom is that referred dlls has garbage at the sections paddings. I send 2 samples to Mumit if he'd like to take a look at them. Here's a utility to check relocatabilty by practise: ---- #include char tempname[100]; void main(int argc,char *argv[]) { HANDLE h=0,h2=0; if (argc!=2) {printf("Usage: check-dll-reloc \n"); exit(0);} h=LoadLibrary(argv[1]); if (!h) {printf("Couldn't load image '%s' at all\n",argv[1]); exit(0);} strcpy(tempname,"dllXXXXXX"); mktemp(tempname); strcat(tempname,".dll"); printf("Copying to temp '%s'\n",tempname); CopyFile(argv[1],tempname,TRUE); h2=LoadLibrary(tempname); printf("Handles (load addrs) are: %x %x\n",h,h2); printf("Image is %srelocatable\n",h2?"":"NOT "); FreeLibrary(h); FreeLibrary(h2); DeleteFile(tempname); } ---- The problem itself is due win95 SetFilePointer(), when seeking past end of file, leaving previous medium contents in areas not explicitly written, despite POSIX saying they should be zeroed. BFD likes such seeks, so it goes. In cygwin b20 dll was introduced workaround for this, so its ld produces correct dll's. It's, however, would be nice to have mingw32 self-sufficient, so I tried to fix it. I cast aside making wrapper around lseek by analogy with cygwin because I neither like that solution nor have idea how to implement it correctly. Instead I found "bad" places in BFD and did workarounds there. Attached is patch as of bfd from cygwin b20. It's somewhat adhoc, so changes wrapped in #ifdefs. With this patch dll's are ok. (If someone has this problems and wants immediate solution, there's precompiled binary at http://ftp.is.lg.ua/pub/gnuwin32/alpha/ld-mingw32-replacement.zip . It's however an alpha effort featuring bfd as dll (required) at http://ftp.is.lg.ua/pub/gnuwin32/alpha/bfd-dll.zip and another underlying library). But strip built with patched bfd still wrecks dll off relocatability, just as cygwin b20 strip does. Best regards, Paul mailto:paul-ml@is.lg.ua coffcode.h.dif -- Want to unsubscribe from this list? Send a message to cygwin-unsubscribe@sourceware.cygnus.com