mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 05:12:28 +08:00
==> bfd/ChangeLog <==
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com> * cofflink.c (process_embedded_commands): Ignore "-aligncomm". ==> gas/ChangeLog <== 2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com> * NEWS: Mention new feature. * config/obj-coff.c (obj_coff_common_parse): New function. (obj_coff_comm): Likewise. (coff_pseudo_table): Override default ".comm" definition on PE. * doc/as.texinfo: Document new feature. ==> gas/testsuite/ChangeLog <== 2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com> * gas/pe/: New directory for PE format-specific tests. * gas/pe/aligncomm-a.d: New test pattern file. * gas/pe/aligncomm-a.s: New test source file. * gas/pe/aligncomm-b.d: New test pattern file. * gas/pe/aligncomm-b.s: New test source file. * gas/pe/aligncomm-c.d: New test pattern file. * gas/pe/aligncomm-c.s: New test source file. * gas/pe/aligncomm-d.d: New test pattern file. * gas/pe/aligncomm-d.s: New test source file. * gas/pe/pe.exp: New test control script. * lib/gas-defs.exp (is_pecoff_format): New function. ==> ld/ChangeLog <== 2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com> * NEWS: Mention new feature. * deffile.h (def_file_aligncomm): Add new struct definition. (def_file): Add new def_file_aligncomm member. * deffilep.y (%token): Add new ALIGNCOMM token. (command): Add production rule for ALIGNCOMM. (def_file_free): Free any chained def_file_aligncomm structs. (diropts[]): Add entry for '-aligncomm' .drectve command. (def_aligncomm): New grammar function. * ld.texinfo: Document new feature. * pe-dll.c (process_def_file): Rename from this ... (process_def_file_and_drectve): ... to this, updating all callers, and process any aligncomms chained to the def file after scanning all .drectve sections. (generate_edata): Updated to match. (pe_dll_build_sections): Likewise. ==> ld/testsuite/ChangeLog <== 2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com> * ld-pe/aligncomm-1.c: New test source file. * ld-pe/aligncomm-2.c: Likewise. * ld-pe/aligncomm-3.c: Likewise. * ld-pe/aligncomm-4.c: Likewise. * ld-pe/aligncomm.d: New test pattern file. * ld-pe/direct.exp: Deleted, and content moved into ... * ld-pe/pe-run.exp: ... New common file for all PE run tests. * ld-pe/vers-script.exp: Deleted, and content merged into ... * ld-pe/pe-compile.exp: ... New common file for PE tests needing a compiler, adding aligned common tests. * ld-pe/pe.exp: Update header comment.
This commit is contained in:
@ -1,3 +1,7 @@
|
||||
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||
|
||||
* cofflink.c (process_embedded_commands): Ignore "-aligncomm".
|
||||
|
||||
2009-05-15 Andrew Stubbs <ams@codesourcery.com>
|
||||
Paul Brook <paul@codesourcery.com>
|
||||
|
||||
|
@ -1282,6 +1282,15 @@ process_embedded_commands (bfd *output_bfd,
|
||||
else if (CONST_STRNEQ (s, "-stack"))
|
||||
s = dores_com (s + 6, output_bfd, 0);
|
||||
|
||||
/* GNU extension for aligned commons. */
|
||||
else if (CONST_STRNEQ (s, "-aligncomm:"))
|
||||
{
|
||||
/* Common symbols must be aligned on reading, as it
|
||||
is too late to do anything here, after they have
|
||||
already been allocated, so just skip the directive. */
|
||||
s += 11;
|
||||
}
|
||||
|
||||
else
|
||||
s++;
|
||||
}
|
||||
|
@ -1,3 +1,11 @@
|
||||
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||
|
||||
* NEWS: Mention new feature.
|
||||
* config/obj-coff.c (obj_coff_common_parse): New function.
|
||||
(obj_coff_comm): Likewise.
|
||||
(coff_pseudo_table): Override default ".comm" definition on PE.
|
||||
* doc/as.texinfo: Document new feature.
|
||||
|
||||
2009-05-17 Kai Tietz <kai.tietz@onevision.com>
|
||||
|
||||
* config/obj-coff.c (obj_coff_section): Add 'y' as
|
||||
|
2
gas/NEWS
2
gas/NEWS
@ -1,5 +1,7 @@
|
||||
-*- text -*-
|
||||
|
||||
* Add support for common symbol alignment to PE formats.
|
||||
|
||||
* Add support for the new discriminator column in the DWARF line table,
|
||||
with a discriminator operand for the .loc directive.
|
||||
|
||||
|
@ -169,6 +169,71 @@ obj_coff_bss (int ignore ATTRIBUTE_UNUSED)
|
||||
s_lcomm (0);
|
||||
}
|
||||
|
||||
#ifdef TE_PE
|
||||
/* Called from read.c:s_comm after we've parsed .comm symbol, size.
|
||||
Parse a possible alignment value. */
|
||||
|
||||
static symbolS *
|
||||
obj_coff_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size)
|
||||
{
|
||||
addressT align = 0;
|
||||
|
||||
if (*input_line_pointer == ',')
|
||||
{
|
||||
align = parse_align (0);
|
||||
if (align == (addressT) -1)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
S_SET_VALUE (symbolP, size);
|
||||
S_SET_EXTERNAL (symbolP);
|
||||
S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
|
||||
|
||||
symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
|
||||
|
||||
/* There is no S_SET_ALIGN (symbolP, align) in COFF/PE.
|
||||
Instead we must add a note to the .drectve section. */
|
||||
if (align)
|
||||
{
|
||||
segT current_seg = now_seg;
|
||||
subsegT current_subseg = now_subseg;
|
||||
flagword oldflags;
|
||||
asection *sec;
|
||||
size_t pfxlen, numlen;
|
||||
char *frag;
|
||||
char numbuff[20];
|
||||
|
||||
sec = subseg_new (".drectve", 0);
|
||||
oldflags = bfd_get_section_flags (stdoutput, sec);
|
||||
if (oldflags == SEC_NO_FLAGS)
|
||||
{
|
||||
if (!bfd_set_section_flags (stdoutput, sec,
|
||||
TC_COFF_SECTION_DEFAULT_ATTRIBUTES))
|
||||
as_warn (_("error setting flags for \"%s\": %s"),
|
||||
bfd_section_name (stdoutput, sec),
|
||||
bfd_errmsg (bfd_get_error ()));
|
||||
}
|
||||
|
||||
/* Emit a string. Note no NUL-termination. */
|
||||
pfxlen = strlen (" -aligncomm:") + strlen (S_GET_NAME (symbolP)) + 1;
|
||||
numlen = snprintf (numbuff, sizeof (numbuff), "%d", (int) align);
|
||||
frag = frag_more (pfxlen + numlen);
|
||||
(void) sprintf (frag, " -aligncomm:%s,", S_GET_NAME (symbolP));
|
||||
memcpy (frag + pfxlen, numbuff, numlen);
|
||||
/* Restore original subseg. */
|
||||
subseg_set (current_seg, current_subseg);
|
||||
}
|
||||
|
||||
return symbolP;
|
||||
}
|
||||
|
||||
static void
|
||||
obj_coff_comm (int ignore ATTRIBUTE_UNUSED)
|
||||
{
|
||||
s_comm_internal (ignore, obj_coff_common_parse);
|
||||
}
|
||||
#endif /* TE_PE */
|
||||
|
||||
#define GET_FILENAME_STRING(X) \
|
||||
((char *) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
|
||||
|
||||
@ -1784,6 +1849,10 @@ const pseudo_typeS coff_pseudo_table[] =
|
||||
/* We accept the .bss directive for backward compatibility with
|
||||
earlier versions of gas. */
|
||||
{"bss", obj_coff_bss, 0},
|
||||
#ifdef TE_PE
|
||||
/* PE provides an enhanced version of .comm with alignment. */
|
||||
{"comm", obj_coff_comm, 0},
|
||||
#endif /* TE_PE */
|
||||
{"def", obj_coff_def, 0},
|
||||
{"dim", obj_coff_dim, 0},
|
||||
{"endef", obj_coff_endef, 0},
|
||||
|
@ -4308,16 +4308,23 @@ absolute expression. If @code{@value{LD}} sees multiple common symbols with
|
||||
the same name, and they do not all have the same size, it will allocate space
|
||||
using the largest size.
|
||||
|
||||
@ifset ELF
|
||||
When using ELF, the @code{.comm} directive takes an optional third argument.
|
||||
This is the desired alignment of the symbol, specified as a byte boundary (for
|
||||
example, an alignment of 16 means that the least significant 4 bits of the
|
||||
address should be zero). The alignment must be an absolute expression, and it
|
||||
must be a power of two. If @code{@value{LD}} allocates uninitialized memory
|
||||
for the common symbol, it will use the alignment when placing the symbol. If
|
||||
no alignment is specified, @command{@value{AS}} will set the alignment to the
|
||||
@ifset COFF-ELF
|
||||
When using ELF or (as a GNU extension) PE, the @code{.comm} directive takes
|
||||
an optional third argument. This is the desired alignment of the symbol,
|
||||
specified for ELF as a byte boundary (for example, an alignment of 16 means
|
||||
that the least significant 4 bits of the address should be zero), and for PE
|
||||
as a power of two (for example, an alignment of 5 means aligned to a 32-byte
|
||||
boundary). The alignment must be an absolute expression, and it must be a
|
||||
power of two. If @code{@value{LD}} allocates uninitialized memory for the
|
||||
common symbol, it will use the alignment when placing the symbol. If no
|
||||
alignment is specified, @command{@value{AS}} will set the alignment to the
|
||||
largest power of two less than or equal to the size of the symbol, up to a
|
||||
maximum of 16.
|
||||
maximum of 16 on ELF, or the default section alignment of 4 on PE@footnote{This
|
||||
is not the same as the executable image file alignment controlled by @code{@value{LD}}'s
|
||||
@samp{--section-alignment} option; image file sections in PE are aligned to
|
||||
multiples of 4096, which is far too large an alignment for ordinary variables.
|
||||
It is rather the default alignment for (non-debug) sections within object
|
||||
(@samp{*.o}) files, which are less strictly aligned.}.
|
||||
@end ifset
|
||||
|
||||
@ifset HPPA
|
||||
|
@ -1,3 +1,17 @@
|
||||
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||
|
||||
* gas/pe/: New directory for PE format-specific tests.
|
||||
* gas/pe/aligncomm-a.d: New test pattern file.
|
||||
* gas/pe/aligncomm-a.s: New test source file.
|
||||
* gas/pe/aligncomm-b.d: New test pattern file.
|
||||
* gas/pe/aligncomm-b.s: New test source file.
|
||||
* gas/pe/aligncomm-c.d: New test pattern file.
|
||||
* gas/pe/aligncomm-c.s: New test source file.
|
||||
* gas/pe/aligncomm-d.d: New test pattern file.
|
||||
* gas/pe/aligncomm-d.s: New test source file.
|
||||
* gas/pe/pe.exp: New test control script.
|
||||
* lib/gas-defs.exp (is_pecoff_format): New function.
|
||||
|
||||
2009-05-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gas/lns/lns-common-1-ia64.s: Add test for discriminator.
|
||||
|
12
gas/testsuite/gas/pe/aligncomm-a.d
Executable file
12
gas/testsuite/gas/pe/aligncomm-a.d
Executable file
@ -0,0 +1,12 @@
|
||||
#objdump: -s -j .drectve
|
||||
#name: aligned common A
|
||||
|
||||
# Test the aligned form of the .comm pseudo-op.
|
||||
|
||||
.*: .*
|
||||
|
||||
Contents of section .drectve:
|
||||
0000 202d616c 69676e63 6f6d6d3a 5f682c35 -aligncomm:_h,5
|
||||
0010 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
|
||||
0020 202d616c 69676e63 6f6d6d3a 5f6a2c33 -aligncomm:_j,3
|
||||
0030 202d616c 69676e63 6f6d6d3a 5f6b2c32 -aligncomm:_k,2
|
11
gas/testsuite/gas/pe/aligncomm-a.s
Executable file
11
gas/testsuite/gas/pe/aligncomm-a.s
Executable file
@ -0,0 +1,11 @@
|
||||
.file "a.c"
|
||||
.comm _h, 16
|
||||
.comm _i, 16
|
||||
.comm _j, 16
|
||||
.comm _k, 16
|
||||
.section .drectve
|
||||
.ascii " -aligncomm:_h,5"
|
||||
.ascii " -aligncomm:_i,4"
|
||||
.ascii " -aligncomm:_j,3"
|
||||
.ascii " -aligncomm:_k,2"
|
||||
|
16
gas/testsuite/gas/pe/aligncomm-b.d
Executable file
16
gas/testsuite/gas/pe/aligncomm-b.d
Executable file
@ -0,0 +1,16 @@
|
||||
#objdump: -s -j .drectve
|
||||
#name: aligned common B
|
||||
|
||||
# Test the aligned form of the .comm pseudo-op.
|
||||
|
||||
.*: .*
|
||||
|
||||
Contents of section .drectve:
|
||||
0000 202d616c 69676e63 6f6d6d3a 5f682c38 -aligncomm:_h,8
|
||||
0010 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
|
||||
0020 202d616c 69676e63 6f6d6d3a 5f6a2c32 -aligncomm:_j,2
|
||||
0030 202d616c 69676e63 6f6d6d3a 5f6b2c31 -aligncomm:_k,1
|
||||
0040 202d616c 69676e63 6f6d6d3a 5f682c35 -aligncomm:_h,5
|
||||
0050 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
|
||||
0060 202d616c 69676e63 6f6d6d3a 5f6a2c33 -aligncomm:_j,3
|
||||
0070 202d616c 69676e63 6f6d6d3a 5f6b2c32 -aligncomm:_k,2
|
11
gas/testsuite/gas/pe/aligncomm-b.s
Normal file
11
gas/testsuite/gas/pe/aligncomm-b.s
Normal file
@ -0,0 +1,11 @@
|
||||
.file "a.c"
|
||||
.comm _h, 16, 8
|
||||
.comm _i, 16, 4
|
||||
.comm _j, 16, 2
|
||||
.comm _k, 16, 1
|
||||
.section .drectve
|
||||
.ascii " -aligncomm:_h,5"
|
||||
.ascii " -aligncomm:_i,4"
|
||||
.ascii " -aligncomm:_j,3"
|
||||
.ascii " -aligncomm:_k,2"
|
||||
|
8
gas/testsuite/gas/pe/aligncomm-c.d
Executable file
8
gas/testsuite/gas/pe/aligncomm-c.d
Executable file
@ -0,0 +1,8 @@
|
||||
#objdump: -s -j .drectve
|
||||
#name: aligned common C
|
||||
|
||||
# Test the aligned form of the .comm pseudo-op.
|
||||
|
||||
.*: .*
|
||||
|
||||
# No .drectve section emitted.
|
5
gas/testsuite/gas/pe/aligncomm-c.s
Executable file
5
gas/testsuite/gas/pe/aligncomm-c.s
Executable file
@ -0,0 +1,5 @@
|
||||
.file "a.c"
|
||||
.comm _h, 16
|
||||
.comm _i, 16
|
||||
.comm _j, 16
|
||||
.comm _k, 16
|
12
gas/testsuite/gas/pe/aligncomm-d.d
Executable file
12
gas/testsuite/gas/pe/aligncomm-d.d
Executable file
@ -0,0 +1,12 @@
|
||||
#objdump: -s -j .drectve
|
||||
#name: aligned common D
|
||||
|
||||
# Test the aligned form of the .comm pseudo-op.
|
||||
|
||||
.*: .*
|
||||
|
||||
Contents of section .drectve:
|
||||
0000 202d616c 69676e63 6f6d6d3a 5f682c38 -aligncomm:_h,8
|
||||
0010 202d616c 69676e63 6f6d6d3a 5f692c34 -aligncomm:_i,4
|
||||
0020 202d616c 69676e63 6f6d6d3a 5f6a2c32 -aligncomm:_j,2
|
||||
0030 202d616c 69676e63 6f6d6d3a 5f6b2c31 -aligncomm:_k,1
|
5
gas/testsuite/gas/pe/aligncomm-d.s
Executable file
5
gas/testsuite/gas/pe/aligncomm-d.s
Executable file
@ -0,0 +1,5 @@
|
||||
.file "a.c"
|
||||
.comm _h, 16, 8
|
||||
.comm _i, 16, 4
|
||||
.comm _j, 16, 2
|
||||
.comm _k, 16, 1
|
34
gas/testsuite/gas/pe/pe.exp
Executable file
34
gas/testsuite/gas/pe/pe.exp
Executable file
@ -0,0 +1,34 @@
|
||||
# Expect control script for GAS testsuite PE object-format-specific tests.
|
||||
|
||||
# Copyright (C) 2009
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
# 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 3 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
# Please email any bugs, comments, and/or additions to this file to:
|
||||
# binutils@gnu.org
|
||||
|
||||
load_lib gas-dg.exp
|
||||
load_lib gas-defs.exp
|
||||
|
||||
# These tests can only be run on PE/COFF platforms.
|
||||
if {![is_pecoff_format]} {
|
||||
return
|
||||
}
|
||||
|
||||
run_dump_test "aligncomm-a"
|
||||
run_dump_test "aligncomm-b"
|
||||
run_dump_test "aligncomm-c"
|
||||
run_dump_test "aligncomm-d"
|
@ -310,6 +310,18 @@ proc is_elf_format {} {
|
||||
return 1
|
||||
}
|
||||
|
||||
# True if the object format is known to be PE COFF.
|
||||
#
|
||||
proc is_pecoff_format {} {
|
||||
if { ![istarget *-*-mingw*] \
|
||||
&& ![istarget *-*-cygwin*] \
|
||||
&& ![istarget *-*-pe*] } {
|
||||
return 0
|
||||
}
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# run_dump_tests TESTCASES EXTRA_OPTIONS
|
||||
# Wrapper for run_dump_test, which is suitable for invoking as
|
||||
# run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
|
||||
|
18
ld/ChangeLog
18
ld/ChangeLog
@ -1,3 +1,21 @@
|
||||
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||
|
||||
* NEWS: Mention new feature.
|
||||
* deffile.h (def_file_aligncomm): Add new struct definition.
|
||||
(def_file): Add new def_file_aligncomm member.
|
||||
* deffilep.y (%token): Add new ALIGNCOMM token.
|
||||
(command): Add production rule for ALIGNCOMM.
|
||||
(def_file_free): Free any chained def_file_aligncomm structs.
|
||||
(diropts[]): Add entry for '-aligncomm' .drectve command.
|
||||
(def_aligncomm): New grammar function.
|
||||
* ld.texinfo: Document new feature.
|
||||
* pe-dll.c (process_def_file): Rename from this ...
|
||||
(process_def_file_and_drectve): ... to this, updating all callers,
|
||||
and process any aligncomms chained to the def file after scanning
|
||||
all .drectve sections.
|
||||
(generate_edata): Updated to match.
|
||||
(pe_dll_build_sections): Likewise.
|
||||
|
||||
2009-05-17 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||
|
||||
2008-08-07 Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>
|
||||
|
4
ld/NEWS
4
ld/NEWS
@ -1,5 +1,9 @@
|
||||
-*- text -*-
|
||||
|
||||
* PE targets now support a GNU extension to allow the alignment of common
|
||||
common symbols to be specified. This support uses custom options in
|
||||
the .drectve section, which will be disregarded by the native tools.
|
||||
|
||||
* PE targets now add primitive support for ELF version scripts; symbols
|
||||
are not versioned, but the local and global symbol visibility directives
|
||||
are respected when filtering symbols in auto-export mode.
|
||||
|
10
ld/deffile.h
10
ld/deffile.h
@ -53,6 +53,12 @@ typedef struct def_file_import {
|
||||
int data; /* = 1 if data */
|
||||
} def_file_import;
|
||||
|
||||
typedef struct def_file_aligncomm {
|
||||
struct def_file_aligncomm *next; /* Chain pointer. */
|
||||
char *symbol_name; /* Name of common symbol. */
|
||||
unsigned int alignment; /* log-2 alignment. */
|
||||
} def_file_aligncomm;
|
||||
|
||||
typedef struct def_file {
|
||||
/* From the NAME or LIBRARY command. */
|
||||
char *name;
|
||||
@ -83,6 +89,10 @@ typedef struct def_file {
|
||||
|
||||
/* From the VERSION command, -1 if not specified. */
|
||||
int version_major, version_minor;
|
||||
|
||||
/* Only expected from .drectve sections, not .DEF files. */
|
||||
def_file_aligncomm *aligncomms;
|
||||
|
||||
} def_file;
|
||||
|
||||
extern def_file *def_file_empty (void);
|
||||
|
@ -89,6 +89,7 @@ static void def_section_alt (const char *, const char *);
|
||||
static void def_stacksize (int, int);
|
||||
static void def_version (int, int);
|
||||
static void def_directive (char *);
|
||||
static void def_aligncomm (char *str, int align);
|
||||
static int def_parse (void);
|
||||
static int def_error (const char *);
|
||||
static int def_lex (void);
|
||||
@ -106,7 +107,7 @@ static const char *lex_parse_string_end = 0;
|
||||
|
||||
%token NAME LIBRARY DESCRIPTION STACKSIZE_K HEAPSIZE CODE DATAU DATAL
|
||||
%token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL
|
||||
%token PRIVATEU PRIVATEL
|
||||
%token PRIVATEU PRIVATEL ALIGNCOMM
|
||||
%token READ WRITE EXECUTE SHARED NONAMEU NONAMEL DIRECTIVE
|
||||
%token <id> ID
|
||||
%token <number> NUMBER
|
||||
@ -134,6 +135,7 @@ command:
|
||||
| VERSIONK NUMBER { def_version ($2, 0);}
|
||||
| VERSIONK NUMBER '.' NUMBER { def_version ($2, $4);}
|
||||
| DIRECTIVE ID { def_directive ($2);}
|
||||
| ALIGNCOMM ID ',' NUMBER { def_aligncomm ($2, $4);}
|
||||
;
|
||||
|
||||
|
||||
@ -379,6 +381,14 @@ def_file_free (def_file *def)
|
||||
free (m);
|
||||
}
|
||||
|
||||
while (def->aligncomms)
|
||||
{
|
||||
def_file_aligncomm *c = def->aligncomms;
|
||||
def->aligncomms = def->aligncomms->next;
|
||||
free (c->symbol_name);
|
||||
free (c);
|
||||
}
|
||||
|
||||
free (def);
|
||||
}
|
||||
|
||||
@ -573,6 +583,7 @@ diropts[] =
|
||||
{ "-stack", STACKSIZE_K },
|
||||
{ "-attr", SECTIONS },
|
||||
{ "-export", EXPORTS },
|
||||
{ "-aligncomm", ALIGNCOMM },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
@ -831,6 +842,18 @@ def_directive (char *str)
|
||||
d->len = strlen (str);
|
||||
}
|
||||
|
||||
static void
|
||||
def_aligncomm (char *str, int align)
|
||||
{
|
||||
def_file_aligncomm *c = xmalloc (sizeof (def_file_aligncomm));
|
||||
|
||||
c->symbol_name = xstrdup (str);
|
||||
c->alignment = (unsigned int) align;
|
||||
|
||||
c->next = def->aligncomms;
|
||||
def->aligncomms = c;
|
||||
}
|
||||
|
||||
static int
|
||||
def_error (const char *err)
|
||||
{
|
||||
|
@ -6994,6 +6994,17 @@ implemented.
|
||||
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.
|
||||
|
||||
@cindex aligned common symbols
|
||||
@item aligned common symbols
|
||||
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's @samp{.drectve} section, which are recognized
|
||||
by @command{ld} 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.
|
||||
@end table
|
||||
|
||||
@ifclear GENERIC
|
||||
|
28
ld/pe-dll.c
28
ld/pe-dll.c
@ -615,7 +615,7 @@ auto_export (bfd *abfd, def_file *d, const char *n)
|
||||
}
|
||||
|
||||
static void
|
||||
process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
|
||||
process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
|
||||
{
|
||||
int i, j;
|
||||
struct bfd_link_hash_entry *blhe;
|
||||
@ -642,6 +642,28 @@ process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
/* Process aligned common symbol information from the
|
||||
.drectve sections now; common symbol allocation is
|
||||
done before final link, so it will be too late to
|
||||
process them in process_embedded_commands() called
|
||||
from _bfd_coff_link_input_bfd(). */
|
||||
if (pe_def_file->aligncomms)
|
||||
{
|
||||
def_file_aligncomm *ac = pe_def_file->aligncomms;
|
||||
while (ac)
|
||||
{
|
||||
struct coff_link_hash_entry *sym_hash;
|
||||
sym_hash = coff_link_hash_lookup (coff_hash_table (info),
|
||||
ac->symbol_name, FALSE, FALSE, FALSE);
|
||||
if (sym_hash && sym_hash->root.type == bfd_link_hash_common
|
||||
&& sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
|
||||
{
|
||||
sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
|
||||
}
|
||||
ac = ac->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we are not building a DLL, when there are no exports
|
||||
we do not build an export table at all. */
|
||||
if (!pe_dll_export_everything && pe_def_file->num_exports == 0
|
||||
@ -1057,7 +1079,7 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
|
||||
}
|
||||
|
||||
/* Fill the exported symbol offsets. The preliminary work has already
|
||||
been done in process_def_file(). */
|
||||
been done in process_def_file_and_drectve(). */
|
||||
|
||||
static void
|
||||
fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
|
||||
@ -3066,7 +3088,7 @@ pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
|
||||
{
|
||||
pe_dll_id_target (bfd_get_target (abfd));
|
||||
pe_output_file_set_long_section_names (abfd);
|
||||
process_def_file (abfd, info);
|
||||
process_def_file_and_drectve (abfd, info);
|
||||
|
||||
if (pe_def_file->num_exports == 0 && !info->shared)
|
||||
return;
|
||||
|
@ -1,3 +1,20 @@
|
||||
2009-05-19 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||
|
||||
* ld-pe/aligncomm-1.c: New test source file.
|
||||
* ld-pe/aligncomm-2.c: Likewise.
|
||||
* ld-pe/aligncomm-3.c: Likewise.
|
||||
* ld-pe/aligncomm-4.c: Likewise.
|
||||
* ld-pe/aligncomm.d: New test pattern file.
|
||||
|
||||
* ld-pe/direct.exp: Deleted, and content moved into ...
|
||||
* ld-pe/pe-run.exp: ... New common file for all PE run tests.
|
||||
|
||||
* ld-pe/vers-script.exp: Deleted, and content merged into ...
|
||||
* ld-pe/pe-compile.exp: ... New common file for PE tests needing
|
||||
a compiler, adding aligned common tests.
|
||||
|
||||
* ld-pe/pe.exp: Update header comment.
|
||||
|
||||
2009-05-17 Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>
|
||||
|
||||
* ld-pe/exports.d: New file.
|
||||
|
19
ld/testsuite/ld-pe/aligncomm-1.c
Executable file
19
ld/testsuite/ld-pe/aligncomm-1.c
Executable file
@ -0,0 +1,19 @@
|
||||
|
||||
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
|
||||
|
||||
long s1 = 0;
|
||||
__m128 r;
|
||||
__m128 * volatile raddr = &r;
|
||||
|
||||
int main (int argc, const char **argv)
|
||||
{
|
||||
return 15 & (int)raddr;
|
||||
}
|
||||
|
||||
void __main (void)
|
||||
{
|
||||
asm (".section .drectve\n"
|
||||
" .ascii \" -aligncomm:_r,4\"\n"
|
||||
" .ascii \" -aligncomm:r,4\"\n"
|
||||
" .text");
|
||||
}
|
20
ld/testsuite/ld-pe/aligncomm-2.c
Executable file
20
ld/testsuite/ld-pe/aligncomm-2.c
Executable file
@ -0,0 +1,20 @@
|
||||
|
||||
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
|
||||
|
||||
long s1 = 0;
|
||||
long s2 = 0;
|
||||
__m128 r;
|
||||
__m128 * volatile raddr = &r;
|
||||
|
||||
int main (int argc, const char **argv)
|
||||
{
|
||||
return 15 & (int)raddr;
|
||||
}
|
||||
|
||||
void __main (void)
|
||||
{
|
||||
asm (".section .drectve\n"
|
||||
" .ascii \" -aligncomm:_r,4\"\n"
|
||||
" .ascii \" -aligncomm:r,4\"\n"
|
||||
" .text");
|
||||
}
|
21
ld/testsuite/ld-pe/aligncomm-3.c
Executable file
21
ld/testsuite/ld-pe/aligncomm-3.c
Executable file
@ -0,0 +1,21 @@
|
||||
|
||||
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
|
||||
|
||||
long s1 = 0;
|
||||
long s2 = 0;
|
||||
long s3 = 0;
|
||||
__m128 r;
|
||||
__m128 * volatile raddr = &r;
|
||||
|
||||
int main (int argc, const char **argv)
|
||||
{
|
||||
return 15 & (int)raddr;
|
||||
}
|
||||
|
||||
void __main (void)
|
||||
{
|
||||
asm (".section .drectve\n"
|
||||
" .ascii \" -aligncomm:_r,4\"\n"
|
||||
" .ascii \" -aligncomm:r,4\"\n"
|
||||
" .text");
|
||||
}
|
22
ld/testsuite/ld-pe/aligncomm-4.c
Executable file
22
ld/testsuite/ld-pe/aligncomm-4.c
Executable file
@ -0,0 +1,22 @@
|
||||
|
||||
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
|
||||
|
||||
long s1 = 0;
|
||||
long s2 = 0;
|
||||
long s3 = 0;
|
||||
long s4 = 0;
|
||||
__m128 r;
|
||||
__m128 * volatile raddr = &r;
|
||||
|
||||
int main (int argc, const char **argv)
|
||||
{
|
||||
return 15 & (int)raddr;
|
||||
}
|
||||
|
||||
void __main (void)
|
||||
{
|
||||
asm (".section .drectve\n"
|
||||
" .ascii \" -aligncomm:_r,4\"\n"
|
||||
" .ascii \" -aligncomm:r,4\"\n"
|
||||
" .text");
|
||||
}
|
3
ld/testsuite/ld-pe/aligncomm.d
Executable file
3
ld/testsuite/ld-pe/aligncomm.d
Executable file
@ -0,0 +1,3 @@
|
||||
#...
|
||||
[0-9a-fA-F]{7,15}0 . r
|
||||
#...
|
@ -1,4 +1,5 @@
|
||||
# Expect script for version-script driven export from dll tests
|
||||
# Expect script for complex PE tests that require a C compiler
|
||||
# in addition to the just-built binutils.
|
||||
# Copyright 2009
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
@ -20,7 +21,7 @@
|
||||
# MA 02110-1301, USA.
|
||||
#
|
||||
|
||||
# This test can only be run on PE/COFF platforms.
|
||||
# These tests can only be run on PE/COFF platforms.
|
||||
if {![is_pecoff_format]} {
|
||||
return
|
||||
}
|
||||
@ -28,6 +29,8 @@ if {![is_pecoff_format]} {
|
||||
# No compiler, no test.
|
||||
if { [which $CC] == 0 } {
|
||||
untested "PE version scripts"
|
||||
untested "aligned common tests"
|
||||
# Add more "untested" directives here when adding more tests below.
|
||||
return
|
||||
}
|
||||
|
||||
@ -74,3 +77,15 @@ run_ver_script_test "vers-script-2"
|
||||
run_ver_script_test "vers-script-3"
|
||||
run_ver_script_test "vers-script-4"
|
||||
|
||||
set align_tests {
|
||||
{"aligned common 1" "" "" {aligncomm-1.c}
|
||||
{{nm -C aligncomm.d}} "aligncomm-1.x"}
|
||||
{"aligned common 2" "" "" {aligncomm-2.c}
|
||||
{{nm -C aligncomm.d}} "aligncomm-2.x"}
|
||||
{"aligned common 3" "" "" {aligncomm-3.c}
|
||||
{{nm -C aligncomm.d}} "aligncomm-3.x"}
|
||||
{"aligned common 4" "" "" {aligncomm-4.c}
|
||||
{{nm -C aligncomm.d}} "aligncomm-4.x"}
|
||||
}
|
||||
|
||||
run_ld_link_tests $align_tests
|
3
ld/testsuite/ld-pe/direct.exp → ld/testsuite/ld-pe/pe-run.exp
Normal file → Executable file
3
ld/testsuite/ld-pe/direct.exp → ld/testsuite/ld-pe/pe-run.exp
Normal file → Executable file
@ -1,4 +1,5 @@
|
||||
# Expect script for direct linking from dll tests
|
||||
# Expect script for complex PE tests that require a C compiler and the ability
|
||||
# to run target executables natively, in addition to the just-built binutils.
|
||||
# Copyright 2006, 2007
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
@ -1,4 +1,4 @@
|
||||
# Expect script for export table in executables tests
|
||||
# Expect script for simple PE tests that require the just-built binutils only.
|
||||
# Copyright 2004, 2006, 2007
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
|
Reference in New Issue
Block a user