This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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: [PATCH] Support forward exports in .def files


From: "Nick Clifton"
Sent: Friday, 27 January 2006 04:07


> Hi Danny,
>
> >> Changelog:
> >> 2005-03-11  Filip Navara  <navaraf@reactos.com>
> >>
> >> * ld/deffile.h, ld/pe-dll.c: Add support for forward exports
> >> in .def files passed directly to 'ld'.
> >> * ld/pe-dll.c (process_def_file): Don't crash on malformed
> >> fastcall symbol names in .def file.
> >>
> >
> > When this patch was submitted,  Filip was asked to complete FSF copyright
> > assignments.
> > The  has been done (#231082).
> >
> > Can this patch go in now?
>
> Yes - please apply it - but ... I think this new feature ought to be
> documented in ld/ld.texinfo and mentioned in ld/NEWS, don't you ?
>
> Cheers
>    Nick


How about this.  There is a lot more that can be added to the documentation,
based on what is indicated in comments in binutils/dlltool.c.  I'll add more as
I confirm that these comments are actually valid for the ld/deffilep.y
implementation.

Danny


Changelog

2006-01-28  Danny Smith  dannysmith@users.sourceforge.net

        * NEWS: mention support for forward exports in PE-COFF dll's.
        * ld.texinfo: Expand documentation of EXPORT statements in PE-COFF .def
files.



Index: NEWS
===================================================================
RCS file: /cvs/src/src/ld/NEWS,v
retrieving revision 1.61
diff -c -3 -p -r1.61 NEWS
*** NEWS 25 Oct 2005 17:40:11 -0000 1.61
--- NEWS 28 Jan 2006 23:56:33 -0000
***************
*** 1,5 ****
--- 1,8 ----
  -*- text -*-

+ * PE-COFF: Forward exports from DLL's can now be specified in .def files
+   passed directly to ld.
+
  * Support for the Z80 processor family has been added.

  * Add support for the "@<file>" syntax to the command line, so that extra
Index: ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.154
diff -c -3 -p -r1.154 ld.texinfo
*** ld.texinfo 16 Jan 2006 16:07:45 -0000 1.154
--- ld.texinfo 28 Jan 2006 23:56:55 -0000
*************** Using a DEF file turns off the normal au
*** 5581,5597 ****
  Here is an example of a DEF file for a shared library called @samp{xyz.dll}:

  @example
! LIBRARY "xyz.dll" BASE=0x10000000

  EXPORTS
  foo
  bar
  _bar = bar
  @end example

! This example defines a base address and three symbols.  The third
! symbol is an alias for the second.  For the complete format
! specification see ld/deffilep.y in the binutils sources.

  @cindex creating a DEF file
  While linking a shared dll, @command{ld} is able to create a DEF file
--- 5581,5647 ----
  Here is an example of a DEF file for a shared library called @samp{xyz.dll}:

  @example
! LIBRARY "xyz.dll" BASE=0x20000000

  EXPORTS
  foo
  bar
  _bar = bar
+ another_foo = abc.dll.afoo
+ var1 DATA
  @end example

! This example defines a DLL with a non-default base address and five
! symbols in the export table. The third exported symbol @code{_bar} is an
! alias for the second. The fourth symbol, @code{another_foo} is resolved
! by "forwarding" to another module and treating it as an alias for
! @code{afoo} exported from the DLL @samp{abc.dll}. The final symbol
! @code{var1} is declared to be a data object.
!
! The complete specification of an export symbol is:
!
! @example
! EXPORTS
!   ( ( ( <name1> [ = <name2> ] )
!      | ( <name1> = <module-name> . <external-name>))
!   [ @@ <integer> ] [ NONAME ] [ DATA ] [ CONSTANT ] [ PRIVATE ] ) *
! @end example
!
! Declares @samp{<name1>} as an exported symbol from the DLL, or declares
! @samp{<name1>} as an exported alias for @samp{<name2>}; or declares
! @samp{<name1>} as a "forward" alias for the symbol
! @samp{<external-name>} in the DLL @samp{<module-name>}.
! Optionally, the symbol may be exported by the specified ordinal
! @samp{<integer>} alias.
!
! The optional keywords that follow the declaration indicate:
!
! @code{NONAME}: Do not put the symbol name in the DLL's export table.  It
! will still be exported by its ordinal alias (either the value specified
! by the .def specification or, otherwise, the value assigned by the
! linker). The symbol name, however, does remain visible in the import
! library (if any), unless @code{PRIVATE} is also specified.
!
! @code{DATA}: The symbol is a variable or object, rather than a function.
! The import lib will export only an indirect reference to @code{foo} as
! the symbol @code{_imp__foo} (ie, @code{foo} must be resolved as
! @code{*_imp__foo}).
!
! @code{CONSTANT}: Like @code{DATA}, but put the undecorated @code{foo} as
! well as @code{_imp__foo} into the import library. Both refer to the read-only
! import address table's pointer to the variable. This can be dangerous.
! If the user code fails to add the @code{dllimport} attribute and also fails
! to explicitly add the extra indirection that the use of the attribute
! enforces, the application will behave unexpectedly.
!
! @code{PRIVATE}: Put the symbol in the DLL's export table, but do not put
! it into the static import library used to resolve imports at link time. The
! symbol can still be imported using the @code{LoadLibrary/GetProcAddress}
! API at runtime or by by using the GNU ld extension of linking directly to
! the DLL without an import library.
!
! See ld/deffilep.y in the binutils sources for the full specification of
! other DEF file statements

  @cindex creating a DEF file
  While linking a shared dll, @command{ld} is able to create a DEF file
>


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