This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: dlopen() bug


> -----Ursprüngliche Nachricht-----
> Von: skaller <skaller <at> users <dot> sourceforge <dot> net>
> Gesendet: 21.03.06 20:31:08

> On Tue, 2006-03-21 at 19:52 +0100, Bernhard Loos wrote:
> > Hello
> > 
> > Is there any progress in solving the problem mentioned in this thread:
> > http://cygwin.com/ml/cygwin/2006-03/msg00274.html ?
> 
> The example in that page is bugged and there is no
> reason at all to expect it to work.
> 
> The mainline ct.c is a C program, it's compiled
> as a C program, and so cannot interact with C++
> libraries.
 
If the C++library declares its calls as 'extern "C"' (as it is done in the example),
AFAIK there shouldn't be any problem.
 
> The mainline of any body of code using C++ MUST be
> compiled as C++. Furthermore you must NOT explicitly
> link libstdc++, that is the job of the compiler.

Yes, but removing the -lstdc++ doesn't make any difference in this example.

> The fact that the example works when libstdc++ is linked
> with the mainline simply suggests an implementation artefact
> that some startup code is stored in the library and the linker
> manages to execute it.
 
It isn't linked against libstdc++. (At least, I don't see, why ist should be.)

> There's no assurance this is actually initialising everything
> correctly. Some initialisation may need to be done 'on the
> bottom of the stack' and/or before other code, and it is too 
> late when a dll is called half way through the program.
> 
> -- 
> John Skaller <skaller at users dot sf dot net>
> Felix, successor to C++: http://felix.sf.net


Anyway all this things aren't really related to the crash.

I removed as much things as possible from the testcase and corrected
the things mentioned above. But I wasn't able to find a solution or even an explaination.

This is a part of the log from depency walker:
00:00:00.438: LoadLibraryA("H:\cygwin\test\CrashTest\CrashTest.dll") called from "CYGWIN1.DLL" at address 0x6100FCB2 by thread 1.
00:00:00.500: Loaded "CRASHTEST.DLL" at address 0x00B40000 by thread 1.  Successfully hooked module.
00:00:00.500: DllMain(0x00B40000, DLL_PROCESS_ATTACH, 0x00000000) in "CRASHTEST.DLL" called by thread 1.
00:00:00.500: First chance exception 0xC0000005 (Access Violation) occurred in "CYGWIN1.DLL" at address 0x610AE938 by thread 1.
00:00:00.500: Unloaded "CRASHTEST.DLL" at address 0x00B40000 by thread 1.
00:00:00.516: LoadLibraryA("H:\cygwin\test\CrashTest\CrashTest.dll") returned NULL by thread 1. Error: Unzulssiger Zugriff auf einen Speicherbereich (998).
00:00:00.578: First chance exception 0xC0000005 (Access Violation) occurred at address 0x00B4F37E by thread 1.
00:00:00.578: First chance exception 0xC0000005 (Access Violation) occurred in "CYGWIN1.DLL" at address 0x6108DFFC by thread 1.
00:00:00.578: First chance exception 0xC0000005 (Access Violation) occurred in "CYGWIN1.DLL" at address 0x6108DFFC by thread 1.
00:00:00.578: First chance exception 0xC0000005 (Access Violation) occurred in "CYGWIN1.DLL" at address 0x6108DFFC by thread 1.

The DllMain fails for some reason.
The program crashs with a stack-overflow after a few hundred lines of like the last three.

With 1.5.18, everything works as aspected.

file ct.cc:
-------------------------------------------------------------------------------
#include <stdio.h>
#include <dlfcn.h>


extern "C"
void test();

int main(int argc, char** argv)
{
	char* pszdll="./CrashTest.dll";

	printf("\n\ndlopening %s\n", pszdll);

	void* hDLL = dlopen(pszdll, 0);

	if(hDLL)
	{
    	printf("OK\n");
	}
	else
		printf("Error dlopening %s\n", pszdll);

	return 0;
}

#ifdef HARDLINKTEST
void TestLinked(char* pszdll)
{
	test();
}
#endif
------------------------------------------------------------------

crashtest.cc:
------------------------------------------------------------------
#include <iostream>

extern "C" __declspec(dllexport)
void test()
{
	return;
}
-----------------------------------------------------------------

compile with:
g++ -W -Wall -g -DMAKEDLL -DDEBUG CrashTest.cc -shared -o CrashTest.dll

g++ -g -W -Wall -DUSEDLL -DDEBUG ct.cc -o ctCRASH.exe
g++ -W -Wall -DHARDLINKTEST -DUSEDLL -DDEBUG ct.cc -o ctOK.exe -L./  -lCrashTest


              Bernhard Loos
______________________________________________________________________
XXL-Speicher, PC-Virenschutz, Spartarife & mehr: Nur im WEB.DE Club!		
Jetzt gratis testen! http://freemail.web.de/home/landingpad/?mc=021130


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]