This is the mail archive of the cygwin@sourceware.cygnus.com 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]

export data from a b18 DLL? (stdout bug?)



Is it possible to export data (as opposed to a function) from a dll? 
For instance, can I access a malloc'ed structure located in one dll
from a different dll by exporting a structure pointer to the allocated 
space? I know this can be done in MSVC++, but when I try it using
cygwin32, I receive a SIGSEGV when attempting to reference the pointer.
Does this issue have anything to do with the bug described below?

I recieve a SIGSEGV when attempting to set a FILE * = stdout within a dll.
Platform is NT4.0SP3 on a pentium with cygwin32 beta 18.

The problem can be recreated with the 5 small files below.
"dbpcc8.sh stdout" will create stdout.dll
gcc -g main2.c creates a.exe which tries to load C:\tmp\stdout.dll and 
 call stdout_dll().
init.cc and fixup.c are the standard files included for completeness.
The SIGSEGV occurs at line 7 of stdout.c "fp=stdout".

Any help resolving this problem is appreciated.

Thanks,
Ron Kulper
ron@dbpower.com

stdout.c
--------------------------------------------------------------------------------
#include <stdio.h>

void
stdout_dll()
{
	FILE *fp;
	fp=stdout;
	fprintf(fp,"hello\n");
}
main()
{
	stdout_dll();
}
--------------------------------------------------------------------------------


main2.c
--------------------------------------------------------------------------------
#include <stdio.h>
#include "windows.h"

typedef void (*vfp)();


main()
{
	vfp dbp_init_func;
	HINSTANCE lib_handle = LoadLibrary("c:\\tmp\\stdout.dll");
	if(lib_handle == NULL)
	{
		perror("Error loading DLL");
		exit(0);
	}

	dbp_init_func = (vfp) GetProcAddress(lib_handle, "stdout_dll");
	if(dbp_init_func == NULL)
	{
		perror("Error loading func dbp_init_report");
		exit(0);
	}

	dbp_init_func();

	FreeLibrary(lib_handle);
}
--------------------------------------------------------------------------------



dbpcc8.sh
--------------------------------------------------------------------------------
export LIBPATH="C:/gnuwin32/b18/H-i386-cygwin32/i386-cygwin32/lib"
echo EXPORTS > $1.def
gcc -DCYGWIN32 -g -c  $1.c
nm $1.o | grep '^........ [T] _'|sed 's/[^_]*_//' >> $1.def
ld --base-file $1.base --dll -o $1.dll $1.o  init.o fixup.o $LIBPATH/libcygwin.a $LIBPATH/libkernel32.a -e _dll_entry@12
dlltool --as=as --dllname $1.dll --def $1.def --base-file $1.base --output-exp $1.exp
ld --base-file $1.base $1.exp --dll -o $1.dll $1.o  init.o fixup.o $LIBPATH/libcygwin.a $LIBPATH/libkernel32.a -e _dll_entry@12
dlltool --as=as --dllname $1.dll --def $1.def --base-file $1.base --output-exp $1.exp
ld $1.exp --dll -o $1.dll $1.o  init.o fixup.o $LIBPATH/libcygwin.a $LIBPATH/libkernel32.a -e _dll_entry@12
dlltool --as=as --dllname $1.dll --def $1.def --output-lib $1.a
--------------------------------------------------------------------------------


init.cc
--------------------------------------------------------------------------------
/* #include GNU version 2 copyright */
#include <windows.h>
extern "C"
{
	int WINAPI dll_entry (HANDLE h, DWORD reason, void *ptr);
};

int WINAPI dll_entry (HANDLE, DWORD reason, void *)
{
	switch(reason)
	{
		case DLL_PROCESS_ATTACH:
			break;
		case DLL_PROCESS_DETACH:
			break;
		case DLL_THREAD_ATTACH:
			break;
		case DLL_THREAD_DETACH:
			break;
	}
	return 1;
}
--------------------------------------------------------------------------------


fixup.c
--------------------------------------------------------------------------------
asm(".section .idata$3\n" ".long 0,0,0,0, 0,0,0,0");
--------------------------------------------------------------------------------

-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".


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