]> git.ipfire.org Git - thirdparty/libtool.git/commitdiff
* ltmain.in (impgen.c): Added a new embedded C file that can be
authorGary V. Vaughan <gary@gnu.org>
Thu, 18 Feb 1999 14:46:46 +0000 (14:46 +0000)
committerGary V. Vaughan <gary@gnu.org>
Thu, 18 Feb 1999 14:46:46 +0000 (14:46 +0000)
used under win32 to extract a def file (symbol export list) from a
dll that has none.  Code to use it might need to wait for the ILD
merge before it will be useful...

ChangeLog
ltmain.in

index ab406acd51b0cc5686a99139c2f285e5b78bf480..0a861c4c02cd3275e6fca8ab9c161c4ec3b4aabd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+1999-02-18  Gary V. Vaughan  <gvaughan@oranda.demon.co.uk>
+
+       * ltmain.in (impgen.c): Added a new embedded C file that can be
+       used under win32 to extract a def file (symbol export list) from a
+       dll that has none.  Code to use it might need to wait for the ILD
+       merge before it will be useful...
+       
 1999-02-18  Thomas Tanner  <tanner@gmx.de>
 
        * TODO: updated
        anything about the format of the date, just that it does not
        contain `$'
 
-1999-01-22  Gary V. Vaughan  <garyv@oranda.demon.co.uk>
+1999-01-22  Gary V. Vaughan  <gvaughan@oranda.demon.co.uk>
 
        * configure.in (date): echo the version number during
        configuration, and show $date for cvs versions.
        * demo/configure.in, demo/Makefile.am (DLPREOPEN): reverted; it
        didn't make any difference.
 
-1999-01-21  Gary V. Vaughan  <garyv@oranda.demon.co.uk>
+1999-01-21  Gary V. Vaughan  <gvaughan@oranda.demon.co.uk>
 
        * THANKS: Added Chris Laas <golem@MIT.EDU>
        
        * mdemo/Makefile.am: use -export-dynamic until libtool 
          and libltdl are able to handle module dependencies
          
-1999-01-14  Gary V. Vaughan  <garyv@oranda.demon.co.uk>
+1999-01-14  Gary V. Vaughan  <gvaughan@oranda.demon.co.uk>
 
        * THANKS: added Mark Elbrecht.
        * ltconfig.in (PATH_SEPARATOR): new variable to hold valid $PATH
        * mdemo/modules/Makefile.am: replaced -export-symbols with 
        -export-dynamic since it doesn't work for modules
        
-1998-12-01  Gary V. Vaughan  <garyv@oranda.demon.co.uk>
+1998-12-01  Gary V. Vaughan  <gvaughan@oranda.demon.co.uk>
 
        * README: Updated homepage pointer to gnu libtool page.
 
 
        * config.guess, config.sub: imported from autoconf pre-2.13
 
-1998-11-27  Gary V. Vaughan  <garyv@oranda.demon.co.uk>
+1998-11-27  Gary V. Vaughan  <gvaughan@oranda.demon.co.uk>
 
        * libtool (AM_PROG_LD): Oops... we need to know the host_os for
        the changes below.  I'm not sure whether mingw32 and os2 support
index 092263265a9804bab4a94b20be95134f717d3daf..1ac6ea2551158d048b63fd44e42eb7d65949bc58 100644 (file)
--- a/ltmain.in
+++ b/ltmain.in
@@ -643,6 +643,138 @@ compiler."
 #   return TRUE;
 # }
 # /* ltdll.c ends here */
+      # This is a source program that is used to create import libraries
+      # on Windows for dlls which lack them. Don't remove nor modify the
+      # starting and closing comments
+# /* impgen.c starts here */
+# /*   Copyright (C) 1999 Free Software Foundation, Inc.
+# 
+#  This file is part of GNU libtool.
+# 
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+# 
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+# 
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  */
+# 
+#  #include <stdio.h>          /* for printf() */
+#  #include <unistd.h>         /* for open(), lseek(), read() */
+#  #include <fcntl.h>          /* for O_RDONLY, O_BINARY */
+#  #include <string.h>         /* for strdup() */
+# 
+#  static unsigned int
+#  pe_get16 (fd, offset)
+#       int fd;
+#       int offset;
+#  {
+#    unsigned char b[2];
+#    lseek (fd, offset, SEEK_SET);
+#    read (fd, b, 2);
+#    return b[0] + (b[1]<<8);
+#  }
+# 
+#  static unsigned int
+#  pe_get32 (fd, offset)
+#      int fd;
+#      int offset;
+#  {
+#    unsigned char b[4];
+#    lseek (fd, offset, SEEK_SET);
+#    read (fd, b, 4);
+#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+#  }
+# 
+#  static unsigned int
+#  pe_as32 (ptr)
+#       void *ptr;
+#  {
+#    unsigned char *b = ptr;
+#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+#  }
+# 
+#  int
+#  main (argc, argv)
+#      int argc;
+#      char *argv[];
+#  {
+#      int dll;
+#      unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+#      unsigned long export_rva, export_size, nsections, secptr, expptr;
+#      unsigned long name_rvas, nexp;
+#      unsigned char *expdata, *erva;
+#      char *filename, *dll_name;
+# 
+#      filename = argv[1];
+# 
+#      dll = open(filename, O_RDONLY|O_BINARY);
+#      if (!dll)
+#      return 1;
+# 
+#      dll_name = filename;
+#    
+#      for (i=0; filename[i]; i++)
+#      if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
+#          dll_name = filename + i +1;
+# 
+#      pe_header_offset = pe_get32 (dll, 0x3c);
+#      opthdr_ofs = pe_header_offset + 4 + 20;
+#      num_entries = pe_get32 (dll, opthdr_ofs + 92);
+# 
+#      if (num_entries < 1) /* no exports */
+#      return 1;
+# 
+#      export_rva = pe_get32 (dll, opthdr_ofs + 96);
+#      export_size = pe_get32 (dll, opthdr_ofs + 100);
+#      nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+#      secptr = (pe_header_offset + 4 + 20 +
+#            pe_get16 (dll, pe_header_offset + 4 + 16));
+# 
+#      expptr = 0;
+#      for (i = 0; i < nsections; i++)
+#      {
+#      char sname[8];
+#      unsigned long secptr1 = secptr + 40 * i;
+#      unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+#      unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+#      unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+#      lseek(dll, secptr1, SEEK_SET);
+#      read(dll, sname, 8);
+#      if (vaddr <= export_rva && vaddr+vsize > export_rva)
+#      {
+#          expptr = fptr + (export_rva - vaddr);
+#          if (export_rva + export_size > vaddr + vsize)
+#              export_size = vsize - (export_rva - vaddr);
+#          break;
+#      }
+#      }
+# 
+#      expdata = (unsigned char*)malloc(export_size);
+#      lseek (dll, expptr, SEEK_SET);
+#      read (dll, expdata, export_size);
+#      erva = expdata - export_rva;
+# 
+#      nexp = pe_as32 (expdata+24);
+#      name_rvas = pe_as32 (expdata+32);
+# 
+#      printf ("EXPORTS\n");
+#      for (i = 0; i<nexp; i++)
+#      {
+#      unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+#      printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+#      }
+# 
+#      return 0;
+#  }
+# /* impgen.c ends here */
       ;;
     *)
       allow_undefined=yes