hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This file documents the GNU linker LD
(GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29))
version 2.36.1.
 
Copyright (C) 1991-2021 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts.  A copy of the license is included in the
section entitled "GNU Free Documentation License". -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>LD: WIN32</title>
 
<meta name="description" content="LD: WIN32">
<meta name="keywords" content="LD: WIN32">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="LD-Index.html#LD-Index" rel="index" title="LD Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Machine-Dependent.html#Machine-Dependent" rel="up" title="Machine Dependent">
<link href="Xtensa.html#Xtensa" rel="next" title="Xtensa">
<link href="TI-COFF.html#TI-COFF" rel="previous" title="TI COFF">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="WIN32"></a>
<div class="header">
<p>
Next: <a href="Xtensa.html#Xtensa" accesskey="n" rel="next">Xtensa</a>, Previous: <a href="TI-COFF.html#TI-COFF" accesskey="p" rel="previous">TI COFF</a>, Up: <a href="Machine-Dependent.html#Machine-Dependent" accesskey="u" rel="up">Machine Dependent</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="LD-Index.html#LD-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="ld-and-WIN32-_0028cygwin_002fmingw_0029"></a>
<h3 class="section">5.16 <code>ld</code> and WIN32 (cygwin/mingw)</h3>
 
<p>This section describes some of the win32 specific <code>ld</code> issues.
See <a href="Options.html#Options">Command-line Options</a> for detailed description of the
command-line options mentioned here.
</p>
<dl compact="compact">
<dd><a name="index-import-libraries"></a>
</dd>
<dt><em>import libraries</em></dt>
<dd><p>The standard Windows linker creates and uses so-called import
libraries, which contains information for linking to dll&rsquo;s.  They are
regular static archives and are handled as any other static
archive.  The cygwin and mingw ports of <code>ld</code> have specific
support for creating such libraries provided with the
&lsquo;<samp>--out-implib</samp>&rsquo; command-line option.
</p>
</dd>
<dt><em>exporting DLL symbols</em></dt>
<dd><a name="index-exporting-DLL-symbols"></a>
<p>The cygwin/mingw <code>ld</code> has several ways to export symbols for dll&rsquo;s.
</p>
<dl compact="compact">
<dt><em>using auto-export functionality</em></dt>
<dd><a name="index-using-auto_002dexport-functionality"></a>
<p>By default <code>ld</code> exports symbols with the auto-export functionality,
which is controlled by the following command-line options:
</p>
<ul>
<li> &ndash;export-all-symbols   [This is the default]
</li><li> &ndash;exclude-symbols
</li><li> &ndash;exclude-libs
</li><li> &ndash;exclude-modules-for-implib
</li><li> &ndash;version-script
</li></ul>
 
<p>When auto-export is in operation, <code>ld</code> will export all the non-local
(global and common) symbols it finds in a DLL, with the exception of a few
symbols known to belong to the system&rsquo;s runtime and libraries.  As it will
often not be desirable to export all of a DLL&rsquo;s symbols, which may include
private functions that are not part of any public interface, the command-line
options listed above may be used to filter symbols out from the list for
exporting.  The &lsquo;<samp>--output-def</samp>&rsquo; option can be used in order to see the
final list of exported symbols with all exclusions taken into effect.
</p>
<p>If &lsquo;<samp>--export-all-symbols</samp>&rsquo; is not given explicitly on the
command line, then the default auto-export behavior will be <em>disabled</em>
if either of the following are true:
</p>
<ul>
<li> A DEF file is used.
</li><li> Any symbol in any object file was marked with the __declspec(dllexport) attribute.
</li></ul>
 
</dd>
<dt><em>using a DEF file</em></dt>
<dd><a name="index-using-a-DEF-file"></a>
<p>Another way of exporting symbols is using a DEF file.  A DEF file is
an ASCII file containing definitions of symbols which should be
exported when a dll is created.  Usually it is named &lsquo;<samp>&lt;dll
name&gt;.def</samp>&rsquo; and is added as any other object file to the linker&rsquo;s
command line.  The file&rsquo;s name must end in &lsquo;<samp>.def</samp>&rsquo; or &lsquo;<samp>.DEF</samp>&rsquo;.
</p>
<div class="example">
<pre class="example">gcc -o &lt;output&gt; &lt;objectfiles&gt; &lt;dll name&gt;.def
</pre></div>
 
<p>Using a DEF file turns off the normal auto-export behavior, unless the
&lsquo;<samp>--export-all-symbols</samp>&rsquo; option is also used.
</p>
<p>Here is an example of a DEF file for a shared library called &lsquo;<samp>xyz.dll</samp>&rsquo;:
</p>
<div class="example">
<pre class="example">LIBRARY &quot;xyz.dll&quot; BASE=0x20000000
 
EXPORTS
foo
bar
_bar = bar
another_foo = abc.dll.afoo
var1 DATA
doo = foo == foo2
eoo DATA == var1
</pre></div>
 
<p>This example defines a DLL with a non-default base address and seven
symbols in the export table. The third exported symbol <code>_bar</code> is an
alias for the second. The fourth symbol, <code>another_foo</code> is resolved
by &quot;forwarding&quot; to another module and treating it as an alias for
<code>afoo</code> exported from the DLL &lsquo;<samp>abc.dll</samp>&rsquo;. The final symbol
<code>var1</code> is declared to be a data object. The &lsquo;<samp>doo</samp>&rsquo; symbol in
export library is an alias of &lsquo;<samp>foo</samp>&rsquo;, which gets the string name
in export table &lsquo;<samp>foo2</samp>&rsquo;. The &lsquo;<samp>eoo</samp>&rsquo; symbol is an data export
symbol, which gets in export table the name &lsquo;<samp>var1</samp>&rsquo;.
</p>
<p>The optional <code>LIBRARY &lt;name&gt;</code> command indicates the <em>internal</em>
name of the output DLL. If &lsquo;<samp>&lt;name&gt;</samp>&rsquo; does not include a suffix,
the default library suffix, &lsquo;<samp>.DLL</samp>&rsquo; is appended.
</p>
<p>When the .DEF file is used to build an application, rather than a
library, the <code>NAME &lt;name&gt;</code> command should be used instead of
<code>LIBRARY</code>. If &lsquo;<samp>&lt;name&gt;</samp>&rsquo; does not include a suffix, the default
executable suffix, &lsquo;<samp>.EXE</samp>&rsquo; is appended.
</p>
<p>With either <code>LIBRARY &lt;name&gt;</code> or <code>NAME &lt;name&gt;</code> the optional
specification <code>BASE = &lt;number&gt;</code> may be used to specify a
non-default base address for the image.
</p>
<p>If neither <code>LIBRARY &lt;name&gt;</code> nor  <code>NAME &lt;name&gt;</code> is specified,
or they specify an empty string, the internal name is the same as the
filename specified on the command line.
</p>
<p>The complete specification of an export symbol is:
</p>
<div class="example">
<pre class="example">EXPORTS
  ( (  ( &lt;name1&gt; [ = &lt;name2&gt; ] )
     | ( &lt;name1&gt; = &lt;module-name&gt; . &lt;external-name&gt;))
  [ @ &lt;integer&gt; ] [NONAME] [DATA] [CONSTANT] [PRIVATE] [== &lt;name3&gt;] ) *
</pre></div>
 
<p>Declares &lsquo;<samp>&lt;name1&gt;</samp>&rsquo; as an exported symbol from the DLL, or declares
&lsquo;<samp>&lt;name1&gt;</samp>&rsquo; as an exported alias for &lsquo;<samp>&lt;name2&gt;</samp>&rsquo;; or declares
&lsquo;<samp>&lt;name1&gt;</samp>&rsquo; as a &quot;forward&quot; alias for the symbol
&lsquo;<samp>&lt;external-name&gt;</samp>&rsquo; in the DLL &lsquo;<samp>&lt;module-name&gt;</samp>&rsquo;.
Optionally, the symbol may be exported by the specified ordinal
&lsquo;<samp>&lt;integer&gt;</samp>&rsquo; alias. The optional &lsquo;<samp>&lt;name3&gt;</samp>&rsquo; is the to be used
string in import/export table for the symbol.
</p>
<p>The optional keywords that follow the declaration indicate:
</p>
<p><code>NONAME</code>: Do not put the symbol name in the DLL&rsquo;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</code> is also specified.
</p>
<p><code>DATA</code>: The symbol is a variable or object, rather than a function.
The import lib will export only an indirect reference to <code>foo</code> as
the symbol <code>_imp__foo</code> (ie, <code>foo</code> must be resolved as
<code>*_imp__foo</code>).
</p>
<p><code>CONSTANT</code>: Like <code>DATA</code>, but put the undecorated <code>foo</code> as
well as <code>_imp__foo</code> into the import library. Both refer to the
read-only import address table&rsquo;s pointer to the variable, not to the
variable itself. This can be dangerous. If the user code fails to add
the <code>dllimport</code> attribute and also fails to explicitly add the
extra indirection that the use of the attribute enforces, the
application will behave unexpectedly.
</p>
<p><code>PRIVATE</code>: Put the symbol in the DLL&rsquo;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</code>
API at runtime or by using the GNU ld extension of linking directly to
the DLL without an import library.
</p>
<p>See ld/deffilep.y in the binutils sources for the full specification of
other DEF file statements
</p>
<a name="index-creating-a-DEF-file"></a>
<p>While linking a shared dll, <code>ld</code> is able to create a DEF file
with the &lsquo;<samp>--output-def &lt;file&gt;</samp>&rsquo; command-line option.
</p>
</dd>
<dt><em>Using decorations</em></dt>
<dd><a name="index-Using-decorations"></a>
<p>Another way of marking symbols for export is to modify the source code
itself, so that when building the DLL each symbol to be exported is
declared as:
</p>
<div class="example">
<pre class="example">__declspec(dllexport) int a_variable
__declspec(dllexport) void a_function(int with_args)
</pre></div>
 
<p>All such symbols will be exported from the DLL.  If, however,
any of the object files in the DLL contain symbols decorated in
this way, then the normal auto-export behavior is disabled, unless
the &lsquo;<samp>--export-all-symbols</samp>&rsquo; option is also used.
</p>
<p>Note that object files that wish to access these symbols must <em>not</em>
decorate them with dllexport.  Instead, they should use dllimport,
instead:
</p>
<div class="example">
<pre class="example">__declspec(dllimport) int a_variable
__declspec(dllimport) void a_function(int with_args)
</pre></div>
 
<p>This complicates the structure of library header files, because
when included by the library itself the header must declare the
variables and functions as dllexport, but when included by client
code the header must declare them as dllimport.  There are a number
of idioms that are typically used to do this; often client code can
omit the __declspec() declaration completely.  See
&lsquo;<samp>--enable-auto-import</samp>&rsquo; and &lsquo;<samp>automatic data imports</samp>&rsquo; for more
information.
</p></dd>
</dl>
 
<a name="index-automatic-data-imports"></a>
</dd>
<dt><em>automatic data imports</em></dt>
<dd><p>The standard Windows dll format supports data imports from dlls only
by adding special decorations (dllimport/dllexport), which let the
compiler produce specific assembler instructions to deal with this
issue.  This increases the effort necessary to port existing Un*x
code to these platforms, especially for large
c++ libraries and applications.  The auto-import feature, which was
initially provided by Paul Sokolovsky, allows one to omit the
decorations to achieve a behavior that conforms to that on POSIX/Un*x
platforms. This feature is enabled with the &lsquo;<samp>--enable-auto-import</samp>&rsquo;
command-line option, although it is enabled by default on cygwin/mingw.
The &lsquo;<samp>--enable-auto-import</samp>&rsquo; option itself now serves mainly to
suppress any warnings that are ordinarily emitted when linked objects
trigger the feature&rsquo;s use.
</p>
<p>auto-import of variables does not always work flawlessly without
additional assistance.  Sometimes, you will see this message
</p>
<p>&quot;variable &rsquo;&lt;var&gt;&rsquo; can&rsquo;t be auto-imported. Please read the
documentation for ld&rsquo;s <code>--enable-auto-import</code> for details.&quot;
</p>
<p>The &lsquo;<samp>--enable-auto-import</samp>&rsquo; documentation explains why this error
occurs, and several methods that can be used to overcome this difficulty.
One of these methods is the <em>runtime pseudo-relocs</em> feature, described
below.
</p>
<a name="index-runtime-pseudo_002drelocation"></a>
<p>For complex variables imported from DLLs (such as structs or classes),
object files typically contain a base address for the variable and an
offset (<em>addend</em>) within the variable&ndash;to specify a particular
field or public member, for instance.  Unfortunately, the runtime loader used
in win32 environments is incapable of fixing these references at runtime
without the additional information supplied by dllimport/dllexport decorations.
The standard auto-import feature described above is unable to resolve these
references.
</p>
<p>The &lsquo;<samp>--enable-runtime-pseudo-relocs</samp>&rsquo; switch allows these references to
be resolved without error, while leaving the task of adjusting the references
themselves (with their non-zero addends) to specialized code provided by the
runtime environment.  Recent versions of the cygwin and mingw environments and
compilers provide this runtime support; older versions do not.  However, the
support is only necessary on the developer&rsquo;s platform; the compiled result will
run without error on an older system.
</p>
<p>&lsquo;<samp>--enable-runtime-pseudo-relocs</samp>&rsquo; is not the default; it must be explicitly
enabled as needed.
</p>
<a name="index-direct-linking-to-a-dll"></a>
</dd>
<dt><em>direct linking to a dll</em></dt>
<dd><p>The cygwin/mingw ports of <code>ld</code> support the direct linking,
including data symbols, to a dll without the usage of any import
libraries.  This is much faster and uses much less memory than does the
traditional import library method, especially when linking large
libraries or applications.  When <code>ld</code> creates an import lib, each
function or variable exported from the dll is stored in its own bfd, even
though a single bfd could contain many exports.  The overhead involved in
storing, loading, and processing so many bfd&rsquo;s is quite large, and explains the
tremendous time, memory, and storage needed to link against particularly
large or complex libraries when using import libs.
</p>
<p>Linking directly to a dll uses no extra command-line switches other than
&lsquo;<samp>-L</samp>&rsquo; and &lsquo;<samp>-l</samp>&rsquo;, because <code>ld</code> already searches for a number
of names to match each library.  All that is needed from the developer&rsquo;s
perspective is an understanding of this search, in order to force ld to
select the dll instead of an import library.
</p>
 
<p>For instance, when ld is called with the argument &lsquo;<samp>-lxxx</samp>&rsquo; it will attempt
to find, in the first directory of its search path,
</p>
<div class="example">
<pre class="example">libxxx.dll.a
xxx.dll.a
libxxx.a
xxx.lib
libxxx.lib
cygxxx.dll (*)
libxxx.dll
xxx.dll
</pre></div>
 
<p>before moving on to the next directory in the search path.
</p>
<p>(*) Actually, this is not &lsquo;<samp>cygxxx.dll</samp>&rsquo; but in fact is &lsquo;<samp>&lt;prefix&gt;xxx.dll</samp>&rsquo;,
where &lsquo;<samp>&lt;prefix&gt;</samp>&rsquo; is set by the <code>ld</code> option
&lsquo;<samp>--dll-search-prefix=&lt;prefix&gt;</samp>&rsquo;. In the case of cygwin, the standard gcc spec
file includes &lsquo;<samp>--dll-search-prefix=cyg</samp>&rsquo;, so in effect we actually search for
&lsquo;<samp>cygxxx.dll</samp>&rsquo;.
</p>
<p>Other win32-based unix environments, such as mingw or pw32, may use other
&lsquo;<samp>&lt;prefix&gt;</samp>&rsquo;es, although at present only cygwin makes use of this feature.  It
was originally intended to help avoid name conflicts among dll&rsquo;s built for the
various win32/un*x environments, so that (for example) two versions of a zlib dll
could coexist on the same machine.
</p>
<p>The generic cygwin/mingw path layout uses a &lsquo;<samp>bin</samp>&rsquo; directory for
applications and dll&rsquo;s and a &lsquo;<samp>lib</samp>&rsquo; directory for the import
libraries (using cygwin nomenclature):
</p>
<div class="example">
<pre class="example">bin/
   cygxxx.dll
lib/
   libxxx.dll.a   (in case of dll's)
   libxxx.a       (in case of static archive)
</pre></div>
 
<p>Linking directly to a dll without using the import library can be
done two ways:
</p>
<p>1. Use the dll directly by adding the &lsquo;<samp>bin</samp>&rsquo; path to the link line
</p><div class="example">
<pre class="example">gcc -Wl,-verbose  -o a.exe -L../bin/ -lxxx
</pre></div>
 
<p>However, as the dll&rsquo;s often have version numbers appended to their names
(&lsquo;<samp>cygncurses-5.dll</samp>&rsquo;) this will often fail, unless one specifies
&lsquo;<samp>-L../bin -lncurses-5</samp>&rsquo; to include the version.  Import libs are generally
not versioned, and do not have this difficulty.
</p>
<p>2. Create a symbolic link from the dll to a file in the &lsquo;<samp>lib</samp>&rsquo;
directory according to the above mentioned search pattern.  This
should be used to avoid unwanted changes in the tools needed for
making the app/dll.
</p>
<div class="example">
<pre class="example">ln -s bin/cygxxx.dll lib/[cyg|lib|]xxx.dll[.a]
</pre></div>
 
<p>Then you can link without any make environment changes.
</p>
<div class="example">
<pre class="example">gcc -Wl,-verbose  -o a.exe -L../lib/ -lxxx
</pre></div>
 
<p>This technique also avoids the version number problems, because the following is
perfectly legal
</p>
<div class="example">
<pre class="example">bin/
   cygxxx-5.dll
lib/
   libxxx.dll.a -&gt; ../bin/cygxxx-5.dll
</pre></div>
 
<p>Linking directly to a dll without using an import lib will work
even when auto-import features are exercised, and even when
&lsquo;<samp>--enable-runtime-pseudo-relocs</samp>&rsquo; is used.
</p>
<p>Given the improvements in speed and memory usage, one might justifiably
wonder why import libraries are used at all.  There are three reasons:
</p>
<p>1. Until recently, the link-directly-to-dll functionality did <em>not</em>
work with auto-imported data.
</p>
<p>2. Sometimes it is necessary to include pure static objects within the
import library (which otherwise contains only bfd&rsquo;s for indirection
symbols that point to the exports of a dll).  Again, the import lib
for the cygwin kernel makes use of this ability, and it is not
possible to do this without an import lib.
</p>
<p>3. Symbol aliases can only be resolved using an import lib.  This is
critical when linking against OS-supplied dll&rsquo;s (eg, the win32 API)
in which symbols are usually exported as undecorated aliases of their
stdcall-decorated assembly names.
</p>
<p>So, import libs are not going away.  But the ability to replace
true import libs with a simple symbolic link to (or a copy of)
a dll, in many cases, is a useful addition to the suite of tools
binutils makes available to the win32 developer.  Given the
massive improvements in memory requirements during linking, storage
requirements, and linking speed, we expect that many developers
will soon begin to use this feature whenever possible.
</p>
</dd>
<dt><em>symbol aliasing</em></dt>
<dd><dl compact="compact">
<dt><em>adding additional names</em></dt>
<dd><p>Sometimes, it is useful to export symbols with additional names.
A symbol &lsquo;<samp>foo</samp>&rsquo; will be exported as &lsquo;<samp>foo</samp>&rsquo;, but it can also be
exported as &lsquo;<samp>_foo</samp>&rsquo; by using special directives in the DEF file
when creating the dll.  This will affect also the optional created
import library.  Consider the following DEF file:
</p>
<div class="example">
<pre class="example">LIBRARY &quot;xyz.dll&quot; BASE=0x61000000
 
EXPORTS
foo
_foo = foo
</pre></div>
 
<p>The line &lsquo;<samp>_foo = foo</samp>&rsquo; maps the symbol &lsquo;<samp>foo</samp>&rsquo; to &lsquo;<samp>_foo</samp>&rsquo;.
</p>
<p>Another method for creating a symbol alias is to create it in the
source code using the &quot;weak&quot; attribute:
</p>
<div class="example">
<pre class="example">void foo () { /* Do something.  */; }
void _foo () __attribute__ ((weak, alias (&quot;foo&quot;)));
</pre></div>
 
<p>See the gcc manual for more information about attributes and weak
symbols.
</p>
</dd>
<dt><em>renaming symbols</em></dt>
<dd><p>Sometimes it is useful to rename exports.  For instance, the cygwin
kernel does this regularly.  A symbol &lsquo;<samp>_foo</samp>&rsquo; can be exported as
&lsquo;<samp>foo</samp>&rsquo; but not as &lsquo;<samp>_foo</samp>&rsquo; by using special directives in the
DEF file. (This will also affect the import library, if it is
created).  In the following example:
</p>
<div class="example">
<pre class="example">LIBRARY &quot;xyz.dll&quot; BASE=0x61000000
 
EXPORTS
_foo = foo
</pre></div>
 
<p>The line &lsquo;<samp>_foo = foo</samp>&rsquo; maps the exported symbol &lsquo;<samp>foo</samp>&rsquo; to
&lsquo;<samp>_foo</samp>&rsquo;.
</p></dd>
</dl>
 
<p>Note: using a DEF file disables the default auto-export behavior,
unless the &lsquo;<samp>--export-all-symbols</samp>&rsquo; command-line option is used.
If, however, you are trying to rename symbols, then you should list
<em>all</em> desired exports in the DEF file, including the symbols
that are not being renamed, and do <em>not</em> use the
&lsquo;<samp>--export-all-symbols</samp>&rsquo; option.  If you list only the
renamed symbols in the DEF file, and use &lsquo;<samp>--export-all-symbols</samp>&rsquo;
to handle the other symbols, then the both the new names <em>and</em>
the original names for the renamed symbols will be exported.
In effect, you&rsquo;d be aliasing those symbols, not renaming them,
which is probably not what you wanted.
</p>
<a name="index-weak-externals"></a>
</dd>
<dt><em>weak externals</em></dt>
<dd><p>The Windows object format, PE, specifies a form of weak symbols called
weak externals.  When a weak symbol is linked and the symbol is not
defined, the weak symbol becomes an alias for some other symbol.  There
are three variants of weak externals:
</p><ul>
<li> Definition is searched for in objects and libraries, historically
called lazy externals.
</li><li> Definition is searched for only in other objects, not in libraries.
This form is not presently implemented.
</li><li> No search; the symbol is an alias.  This form is not presently
implemented.
</li></ul>
<p>As a GNU extension, weak symbols that do not specify an alternate symbol
are supported.  If the symbol is undefined when linking, the symbol
uses a default value.
</p>
<a name="index-aligned-common-symbols"></a>
</dd>
<dt><em>aligned common symbols</em></dt>
<dd><p>As a GNU extension to the PE file format, it is possible to specify the
desired alignment for a common symbol.  This information is conveyed from
the assembler or compiler to the linker by means of GNU-specific commands
carried in the object file&rsquo;s &lsquo;<samp>.drectve</samp>&rsquo; section, which are recognized
by <code>ld</code> and respected when laying out the common symbols.  Native
tools will be able to process object files employing this GNU extension,
but will fail to respect the alignment instructions, and may issue noisy
warnings about unknown linker directives.
</p>
</dd>
</dl>
 
 
 
<hr>
<div class="header">
<p>
Next: <a href="Xtensa.html#Xtensa" accesskey="n" rel="next">Xtensa</a>, Previous: <a href="TI-COFF.html#TI-COFF" accesskey="p" rel="previous">TI COFF</a>, Up: <a href="Machine-Dependent.html#Machine-Dependent" accesskey="u" rel="up">Machine Dependent</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="LD-Index.html#LD-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>