+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>
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++;
}
+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
-*- 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.
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])
/* 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},
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
+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.
--- /dev/null
+#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
--- /dev/null
+ .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"
+
--- /dev/null
+#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
--- /dev/null
+ .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"
+
--- /dev/null
+#objdump: -s -j .drectve
+#name: aligned common C
+
+# Test the aligned form of the .comm pseudo-op.
+
+.*: .*
+
+# No .drectve section emitted.
\ No newline at end of file
--- /dev/null
+ .file "a.c"
+ .comm _h, 16
+ .comm _i, 16
+ .comm _j, 16
+ .comm _k, 16
--- /dev/null
+#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
--- /dev/null
+ .file "a.c"
+ .comm _h, 16, 8
+ .comm _i, 16, 4
+ .comm _j, 16, 2
+ .comm _k, 16, 1
--- /dev/null
+# 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"
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]]
+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>
-*- 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.
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;
/* 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);
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);
%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
| 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);}
;
free (m);
}
+ while (def->aligncomms)
+ {
+ def_file_aligncomm *c = def->aligncomms;
+ def->aligncomms = def->aligncomms->next;
+ free (c->symbol_name);
+ free (c);
+ }
+
free (def);
}
{ "-stack", STACKSIZE_K },
{ "-attr", SECTIONS },
{ "-export", EXPORTS },
+ { "-aligncomm", ALIGNCOMM },
{ 0, 0 }
};
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)
{
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
}
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;
}
}
+ /* 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
}
/* 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)
{
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;
+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.
--- /dev/null
+
+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");
+}
--- /dev/null
+
+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");
+}
--- /dev/null
+
+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");
+}
--- /dev/null
+
+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");
+}
--- /dev/null
+#...
+[0-9a-fA-F]{7,15}0 . r
+#...
+++ /dev/null
-# Expect script for direct linking from dll tests
-# Copyright 2006, 2007
-# Free Software Foundation, Inc.
-#
-# This file is part of the GNU Binutils.
-#
-# 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.
-#
-# Written by Pedro Alves <pedro_alves@portugalmail.pt>
-#
-
-# Note:
-#
-# This test checks the "direct linking to a dll" functionality.
-#
-# The test has 7 stages:
-#
-# 1. compile and link a test dll with ".dll" extension.
-#
-# 2. compile and link a test dll with ".sl" (i.e. != ".dll") extension.
-#
-# 3. compile and link a client application linking directly to the ".dll" dll built in 1.
-# This should produce no errors.
-#
-# 4. compile and link a client application linking directly to the ".sl" dll built in 2.
-# This should produce no errors.
-#
-# 5. compile and link a client application linking directly to a symlink into
-# the ".dll" dll built in 1.
-# This should produce no errors.
-#
-# 6. compile and link a client application linking directly to a symlink into
-# the ".sl" dll built in 1.
-# This should produce no errors.
-#
-# 7. run the produced executables
-
-# This test can only be run on PE/COFF platforms.
-if {![is_pecoff_format]} {
- return
-}
-
-# No compiler, no test.
-if { [which $CC] == 0 } {
- untested "Direct linking to dll test"
- return
-}
-
-set tmpdir tmpdir
-
-proc test_direct_link_dll {} {
- global CC
- global CFLAGS
- global srcdir
- global subdir
- global tmpdir
-
- # Compile the dll.
- if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_dll.c $tmpdir/direct_dll.o ] {
- fail "compiling shared lib"
- } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.dll "$tmpdir/direct_dll.o" ] {
- fail "linking shared lib (.dll)"
- } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.sl "$tmpdir/direct_dll.o" ] {
- fail "linking shared lib (.sl)"
- } else {
- # Compile and link the client program.
- if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_client.c $tmpdir/direct_client.o ] {
- fail "compiling client"
- } else {
- # Check linking directly to direct_dll.dll.
- set msg "linking client (.dll)"
- if [ld_simple_link $CC $tmpdir/direct_client_dll.exe "$tmpdir/direct_client.o $tmpdir/direct_dll.dll" ] {
- pass $msg
- } else {
- fail $msg
- }
-
- # Check linking directly to direct_dll.sl.
- set msg "linking client (.sl)"
- if [ld_simple_link $CC $tmpdir/direct_client_sl.exe "$tmpdir/direct_client.o $tmpdir/direct_dll.sl" ] {
- pass $msg
- } else {
- fail $msg
- }
-
- # Check dll direct linking through symlink to .dll.
- # Create symbolic link.
- catch "exec ln -fs direct_dll.dll $tmpdir/libdirect_dll.dll.a" ln_catch
- set msg "linking client (symlink -> .dll)"
- if [ld_simple_link $CC $tmpdir/direct_client_symlink_dll.exe "$tmpdir/direct_client.o $tmpdir/libdirect_dll.dll.a" ] {
- pass $msg
- } else {
- fail $msg
- }
-
- # Check dll direct linking through symlink to .sl.
- # Create symbolic link.
- catch "exec ln -fs direct_dll.sl $tmpdir/libdirect_sl.dll.a" ln_catch
- set msg "linking client (symlink -> .sl)"
- if [ld_simple_link $CC $tmpdir/direct_client_symlink_sl.exe "$tmpdir/direct_client.o $tmpdir/libdirect_sl.dll.a" ] {
- pass $msg
- } else {
- fail $msg
- }
- }
- }
-}
-
-proc directdll_execute {exe msg} {
- set expected ""
- catch "exec $exe" prog_output
- if [string match $expected $prog_output] then {
- pass $msg
- } else {
- verbose $prog_output
- fail $msg
- }
-}
-
-test_direct_link_dll
-
-# This is as far as we can go with a cross-compiler
-if ![isnative] then {
- verbose "Not running natively, so cannot execute binaries"
- return
-}
-
-directdll_execute "$tmpdir/direct_client_dll.exe" "running direct linked dll (.dll)"
-directdll_execute "$tmpdir/direct_client_sl.exe" "running direct linked dll (.sl)"
-directdll_execute "$tmpdir/direct_client_symlink_sl.exe" "running direct linked dll (symlink -> .sl)"
-directdll_execute "$tmpdir/direct_client_symlink_dll.exe" "running direct linked dll (symlink -> .dll)"
--- /dev/null
+# Expect script for complex PE tests that require a C compiler
+# in addition to the just-built binutils.
+# Copyright 2009
+# Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# 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.
+#
+
+# These tests can only be run on PE/COFF platforms.
+if {![is_pecoff_format]} {
+ return
+}
+
+# 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
+}
+
+proc build_vers_script_dll_o {} {
+ global CC
+ global CFLAGS
+ global srcdir
+ global subdir
+
+ # Compile the object file.
+ if ![ld_compile "$CC $CFLAGS -shared" $srcdir/$subdir/vers-script-dll.c tmpdir/vers-script-dll.o] {
+ fail "compiling shared lib object"
+ }
+}
+
+proc run_ver_script_test { testname } {
+ global CC
+ global srcdir
+ global subdir
+ global verbose
+
+ if ![ld_simple_link "$CC -shared \
+ -Wl,--version-script,$srcdir/$subdir/$testname.ver \
+ -Wl,--output-def,tmpdir/$testname.def" tmpdir/$testname.dll \
+ "tmpdir/vers-script-dll.o"] {
+ fail "linking DLL"
+ }
+
+ if { $verbose > 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 3 }
+ if { [regexp_diff tmpdir/$testname.def $srcdir/$subdir/$testname.d] } then {
+ fail $testname
+ if { $verbose == 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 2 }
+ return
+ }
+
+ pass "$testname"
+}
+
+
+build_vers_script_dll_o
+
+run_ver_script_test "vers-script-1"
+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
--- /dev/null
+# 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.
+#
+# This file is part of the GNU Binutils.
+#
+# 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.
+#
+# Written by Pedro Alves <pedro_alves@portugalmail.pt>
+#
+
+# Note:
+#
+# This test checks the "direct linking to a dll" functionality.
+#
+# The test has 7 stages:
+#
+# 1. compile and link a test dll with ".dll" extension.
+#
+# 2. compile and link a test dll with ".sl" (i.e. != ".dll") extension.
+#
+# 3. compile and link a client application linking directly to the ".dll" dll built in 1.
+# This should produce no errors.
+#
+# 4. compile and link a client application linking directly to the ".sl" dll built in 2.
+# This should produce no errors.
+#
+# 5. compile and link a client application linking directly to a symlink into
+# the ".dll" dll built in 1.
+# This should produce no errors.
+#
+# 6. compile and link a client application linking directly to a symlink into
+# the ".sl" dll built in 1.
+# This should produce no errors.
+#
+# 7. run the produced executables
+
+# This test can only be run on PE/COFF platforms.
+if {![is_pecoff_format]} {
+ return
+}
+
+# No compiler, no test.
+if { [which $CC] == 0 } {
+ untested "Direct linking to dll test"
+ return
+}
+
+set tmpdir tmpdir
+
+proc test_direct_link_dll {} {
+ global CC
+ global CFLAGS
+ global srcdir
+ global subdir
+ global tmpdir
+
+ # Compile the dll.
+ if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_dll.c $tmpdir/direct_dll.o ] {
+ fail "compiling shared lib"
+ } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.dll "$tmpdir/direct_dll.o" ] {
+ fail "linking shared lib (.dll)"
+ } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.sl "$tmpdir/direct_dll.o" ] {
+ fail "linking shared lib (.sl)"
+ } else {
+ # Compile and link the client program.
+ if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_client.c $tmpdir/direct_client.o ] {
+ fail "compiling client"
+ } else {
+ # Check linking directly to direct_dll.dll.
+ set msg "linking client (.dll)"
+ if [ld_simple_link $CC $tmpdir/direct_client_dll.exe "$tmpdir/direct_client.o $tmpdir/direct_dll.dll" ] {
+ pass $msg
+ } else {
+ fail $msg
+ }
+
+ # Check linking directly to direct_dll.sl.
+ set msg "linking client (.sl)"
+ if [ld_simple_link $CC $tmpdir/direct_client_sl.exe "$tmpdir/direct_client.o $tmpdir/direct_dll.sl" ] {
+ pass $msg
+ } else {
+ fail $msg
+ }
+
+ # Check dll direct linking through symlink to .dll.
+ # Create symbolic link.
+ catch "exec ln -fs direct_dll.dll $tmpdir/libdirect_dll.dll.a" ln_catch
+ set msg "linking client (symlink -> .dll)"
+ if [ld_simple_link $CC $tmpdir/direct_client_symlink_dll.exe "$tmpdir/direct_client.o $tmpdir/libdirect_dll.dll.a" ] {
+ pass $msg
+ } else {
+ fail $msg
+ }
+
+ # Check dll direct linking through symlink to .sl.
+ # Create symbolic link.
+ catch "exec ln -fs direct_dll.sl $tmpdir/libdirect_sl.dll.a" ln_catch
+ set msg "linking client (symlink -> .sl)"
+ if [ld_simple_link $CC $tmpdir/direct_client_symlink_sl.exe "$tmpdir/direct_client.o $tmpdir/libdirect_sl.dll.a" ] {
+ pass $msg
+ } else {
+ fail $msg
+ }
+ }
+ }
+}
+
+proc directdll_execute {exe msg} {
+ set expected ""
+ catch "exec $exe" prog_output
+ if [string match $expected $prog_output] then {
+ pass $msg
+ } else {
+ verbose $prog_output
+ fail $msg
+ }
+}
+
+test_direct_link_dll
+
+# This is as far as we can go with a cross-compiler
+if ![isnative] then {
+ verbose "Not running natively, so cannot execute binaries"
+ return
+}
+
+directdll_execute "$tmpdir/direct_client_dll.exe" "running direct linked dll (.dll)"
+directdll_execute "$tmpdir/direct_client_sl.exe" "running direct linked dll (.sl)"
+directdll_execute "$tmpdir/direct_client_symlink_sl.exe" "running direct linked dll (symlink -> .sl)"
+directdll_execute "$tmpdir/direct_client_symlink_dll.exe" "running direct linked dll (symlink -> .dll)"
-# 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.
#
+++ /dev/null
-# Expect script for version-script driven export from dll tests
-# Copyright 2009
-# Free Software Foundation, Inc.
-#
-# This file is part of the GNU Binutils.
-#
-# 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.
-#
-
-# This test can only be run on PE/COFF platforms.
-if {![is_pecoff_format]} {
- return
-}
-
-# No compiler, no test.
-if { [which $CC] == 0 } {
- untested "PE version scripts"
- return
-}
-
-proc build_vers_script_dll_o {} {
- global CC
- global CFLAGS
- global srcdir
- global subdir
-
- # Compile the object file.
- if ![ld_compile "$CC $CFLAGS -shared" $srcdir/$subdir/vers-script-dll.c tmpdir/vers-script-dll.o] {
- fail "compiling shared lib object"
- }
-}
-
-proc run_ver_script_test { testname } {
- global CC
- global srcdir
- global subdir
- global verbose
-
- if ![ld_simple_link "$CC -shared \
- -Wl,--version-script,$srcdir/$subdir/$testname.ver \
- -Wl,--output-def,tmpdir/$testname.def" tmpdir/$testname.dll \
- "tmpdir/vers-script-dll.o"] {
- fail "linking DLL"
- }
-
- if { $verbose > 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 3 }
- if { [regexp_diff tmpdir/$testname.def $srcdir/$subdir/$testname.d] } then {
- fail $testname
- if { $verbose == 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 2 }
- return
- }
-
- pass "$testname"
-}
-
-
-build_vers_script_dll_o
-
-run_ver_script_test "vers-script-1"
-run_ver_script_test "vers-script-2"
-run_ver_script_test "vers-script-3"
-run_ver_script_test "vers-script-4"
-