delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2000/10/13/13:08:43

Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT sources DOT redhat DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT sources DOT redhat DOT com>
List-Help: <mailto:cygwin-help AT sources DOT redhat DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT sources DOT redhat DOT com
Delivered-To: mailing list cygwin AT sources DOT redhat DOT com
From: Venkat Iyer <venkat AT comit DOT com>
MIME-Version: 1.0
Message-ID: <14823.16955.691000.133858@gargle.gargle.HOWL>
Date: Fri, 13 Oct 2000 10:11:23 -0700 (Pacific Daylight Time)
To: cygwin AT sourceware DOT cygnus DOT com
Subject: Solution: Exporting symbols from an executable

Greetings,

The Solution - to export symbols from an executable (example is below):

$ dlltool --dllname a.exe --def a.def --output-lib liba.a --output-exp a.exp
$ gcc -o a.exe a.exp a.c
$ gcc --shared b.c -o b.dll liba.a
$ ./a.exe
Succeeded

Jason Tishler suggested that I try postgresql build to see what it
does.  It does a five step process to get things to work.  To be
honest this five step process is described elsewhere for building
dlls.  But since I could build dlls in one step (using -shared), I
figured all this was obsolete documentation.

The above two step (first two commands) subset works for me.

The main thing I was missing is that you HAVE to create a .exp file.
Since most other dlltool functionality is subsumed by ld, I wonder why
this isn't.  Or if there's some option that I couldn't figure out.

My biggest concern is that I skipped the base file creation (from the
five step process).  Things still seem to work.  Does it matter?

All the exports are purely functional (no data).

[Excerpts from my original post to the newsgroup to make this complete]

I want to export symbols from an executable, so that they can be used
to resolve symbols at run time from dlopen'ed libraries.

a.c : defines main and f1()
b.c : defines f2() which uses f1().

I want to end up with a.exe and b.dll.  So that when a.c dlopens b.dll,
f1 is resolved.

The files are :

---a.c----
#include <errno.h>
#include <dlfcn.h>

int f1(void)
{
    return 1;
}

main()
{
    void *p = dlopen(".\\b.dll", RTLD_NOW);
    if (p == 0)
    {
	printf("Failed\n");
	printf("%s\n", strerror(errno));
    }
    else 
    {
	printf("Succeeded\n");
    }
}
----b.c----
#include <cygwin/cygwin_dll.h>

extern int f1(void);

int f2 (void)
{
    return f1();
}

DECLARE_CYGWIN_DLL(DllMain);

----a.def----
EXPORTS
   f1
----------------

-- 
Regards
_______________________________________________________________________
Venkat Iyer       venkat AT comit DOT com          Phone: 1-408-988-2988 x 136 
Comit Systems, Inc.   The Contract Engineering Company    www.comit.com


--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019