* dlltool.c: Include <assert.h>.
(PREFIX_ALIAS_BASE): Define. (struct export): Add member import_name; (def_exports): Set import_name. (make_one_lib_file): Remove prefix alias code, use import_name in .idata$6. (gen_lib_file): Create and delete aliases. * binutils-all/alias.def: New file. * binutils-all/dlltool.exp: Two new -p tests. * config/default.exp (dlltool_gas_flag): New variable. Copy gas and lds executables into tmpdir/gas directory rather than making symlinks which might not be supported by the host OS. Attempt to handle the case where the host OS does not use the .exe extension but the target OS does. * lib/utils-lib.exp (exe_ext): New procedure.
This commit is contained in:
parent
121d8485df
commit
0fd555c412
6 changed files with 109 additions and 48 deletions
|
@ -1,3 +1,13 @@
|
|||
2004-10-23 Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>
|
||||
|
||||
* dlltool.c: Include <assert.h>.
|
||||
(PREFIX_ALIAS_BASE): Define.
|
||||
(struct export): Add member import_name;
|
||||
(def_exports): Set import_name.
|
||||
(make_one_lib_file): Remove prefix alias code, use import_name
|
||||
in .idata$6.
|
||||
(gen_lib_file): Create and delete aliases.
|
||||
|
||||
2004-10-19 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* readelf.c (process_section_groups): Free symtab after use.
|
||||
|
|
|
@ -261,6 +261,8 @@
|
|||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef DLLTOOL_ARM
|
||||
#include "coff/arm.h"
|
||||
#include "coff/internal.h"
|
||||
|
@ -428,7 +430,11 @@ static char * mcore_elf_linker_flags = NULL;
|
|||
#define DRECTVE_SECTION_NAME ".drectve"
|
||||
#endif
|
||||
|
||||
#define PATHMAX 250 /* What's the right name for this ? */
|
||||
/* What's the right name for this ? */
|
||||
#define PATHMAX 250
|
||||
|
||||
/* External name alias numbering starts here. */
|
||||
#define PREFIX_ALIAS_BASE 20000
|
||||
|
||||
char *tmp_asm_buf;
|
||||
char *tmp_head_s_buf;
|
||||
|
@ -642,6 +648,7 @@ typedef struct export
|
|||
{
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
const char *import_name;
|
||||
int ordinal;
|
||||
int constant;
|
||||
int noname; /* Don't put name in image file. */
|
||||
|
@ -901,6 +908,7 @@ def_exports (const char *name, const char *internal_name, int ordinal,
|
|||
|
||||
p->name = name;
|
||||
p->internal_name = internal_name ? internal_name : name;
|
||||
p->import_name = name;
|
||||
p->ordinal = ordinal;
|
||||
p->constant = constant;
|
||||
p->noname = noname;
|
||||
|
@ -2248,7 +2256,6 @@ make_one_lib_file (export_type *exp, int i)
|
|||
asymbol * exp_label;
|
||||
asymbol * iname = 0;
|
||||
asymbol * iname2;
|
||||
asymbol * iname2_pre = 0;
|
||||
asymbol * iname_lab;
|
||||
asymbol ** iname_lab_pp;
|
||||
asymbol ** iname_pp;
|
||||
|
@ -2338,23 +2345,6 @@ make_one_lib_file (export_type *exp, int i)
|
|||
bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC);
|
||||
#endif
|
||||
ptrs[oidx++] = exp_label;
|
||||
|
||||
if (ext_prefix_alias)
|
||||
{
|
||||
asymbol * exp_label_pre;
|
||||
|
||||
exp_label_pre = bfd_make_empty_symbol (abfd);
|
||||
exp_label_pre->name
|
||||
= make_imp_label (ext_prefix_alias, exp->name);
|
||||
exp_label_pre->section = exp_label->section;
|
||||
exp_label_pre->flags = exp_label->flags;
|
||||
exp_label_pre->value = exp_label->value;
|
||||
#ifdef DLLTOOL_ARM
|
||||
if (machine == MTHUMB)
|
||||
bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC);
|
||||
#endif
|
||||
ptrs[oidx++] = exp_label_pre;
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate imp symbols with one underscore for Microsoft
|
||||
|
@ -2375,19 +2365,6 @@ make_one_lib_file (export_type *exp, int i)
|
|||
iname2->flags = BSF_GLOBAL;
|
||||
iname2->value = 0;
|
||||
|
||||
if (ext_prefix_alias)
|
||||
{
|
||||
char *pre_name;
|
||||
|
||||
iname2_pre = bfd_make_empty_symbol (abfd);
|
||||
pre_name = xmalloc (strlen (ext_prefix_alias) + 7);
|
||||
sprintf(pre_name, "__imp_%s", ext_prefix_alias);
|
||||
iname2_pre->name = make_imp_label (pre_name, exp->name);
|
||||
iname2_pre->section = iname2->section;
|
||||
iname2_pre->flags = iname2->flags;
|
||||
iname2_pre->value = iname2->value;
|
||||
}
|
||||
|
||||
iname_lab = bfd_make_empty_symbol (abfd);
|
||||
|
||||
iname_lab->name = head_label;
|
||||
|
@ -2399,8 +2376,6 @@ make_one_lib_file (export_type *exp, int i)
|
|||
if (create_compat_implib)
|
||||
ptrs[oidx++] = iname;
|
||||
ptrs[oidx++] = iname2;
|
||||
if (ext_prefix_alias)
|
||||
ptrs[oidx++] = iname2_pre;
|
||||
|
||||
iname_lab_pp = ptrs + oidx;
|
||||
ptrs[oidx++] = iname_lab;
|
||||
|
@ -2517,11 +2492,11 @@ make_one_lib_file (export_type *exp, int i)
|
|||
why it did that, and it does not match what I see
|
||||
in programs compiled with the MS tools. */
|
||||
int idx = exp->hint;
|
||||
si->size = strlen (xlate (exp->name)) + 3;
|
||||
si->size = strlen (xlate (exp->import_name)) + 3;
|
||||
si->data = xmalloc (si->size);
|
||||
si->data[0] = idx & 0xff;
|
||||
si->data[1] = idx >> 8;
|
||||
strcpy (si->data + 2, xlate (exp->name));
|
||||
strcpy (si->data + 2, xlate (exp->import_name));
|
||||
}
|
||||
break;
|
||||
case IDATA7:
|
||||
|
@ -2843,6 +2818,26 @@ gen_lib_file (void)
|
|||
n = make_one_lib_file (exp, i);
|
||||
n->next = head;
|
||||
head = n;
|
||||
if (ext_prefix_alias)
|
||||
{
|
||||
export_type alias_exp;
|
||||
|
||||
assert (i < PREFIX_ALIAS_BASE);
|
||||
alias_exp.name = make_imp_label (ext_prefix_alias, exp->name);
|
||||
alias_exp.internal_name = exp->internal_name;
|
||||
alias_exp.import_name = exp->name;
|
||||
alias_exp.ordinal = exp->ordinal;
|
||||
alias_exp.constant = exp->constant;
|
||||
alias_exp.noname = exp->noname;
|
||||
alias_exp.private = exp->private;
|
||||
alias_exp.data = exp->data;
|
||||
alias_exp.hint = exp->hint;
|
||||
alias_exp.forward = exp->forward;
|
||||
alias_exp.next = exp->next;
|
||||
n = make_one_lib_file (&alias_exp, i + PREFIX_ALIAS_BASE);
|
||||
n->next = head;
|
||||
head = n;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now stick them all into the archive. */
|
||||
|
@ -2886,6 +2881,13 @@ gen_lib_file (void)
|
|||
if (unlink (name) < 0)
|
||||
/* xgettext:c-format */
|
||||
non_fatal (_("cannot delete %s: %s"), name, strerror (errno));
|
||||
if (ext_prefix_alias)
|
||||
{
|
||||
sprintf (name, "%s%05d.o", TMP_STUB, i + PREFIX_ALIAS_BASE);
|
||||
if (unlink (name) < 0)
|
||||
/* xgettext:c-format */
|
||||
non_fatal (_("cannot delete %s: %s"), name, strerror (errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
2004-10-23 Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>
|
||||
|
||||
* binutils-all/alias.def: New file.
|
||||
* binutils-all/dlltool.exp: Two new -p tests.
|
||||
* config/default.exp (dlltool_gas_flag): New variable.
|
||||
Copy gas and lds executables into tmpdir/gas directory rather than
|
||||
making symlinks which might not be supported by the host OS.
|
||||
Attempt to handle the case where the host OS does not use the .exe
|
||||
extension but the target OS does.
|
||||
* lib/utils-lib.exp (exe_ext): New procedure.
|
||||
|
||||
2004-07-12 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* binutils-all/dlltool.exp: Check that the -p switch is not
|
||||
|
|
|
@ -41,19 +41,36 @@ if ![string match "" $err] then {
|
|||
send_log "$err\n"
|
||||
verbose "$err" 1
|
||||
fail "dlltool (fastcall export)"
|
||||
continue
|
||||
} else {
|
||||
pass "dlltool (fastcall export)"
|
||||
}
|
||||
|
||||
pass "dlltool (fastcall export)"
|
||||
|
||||
verbose "$DLLTOOL -p foo -d $srcdir/$subdir/fastcall.def" 1
|
||||
catch "exec $DLLTOOL -p foo -d $srcdir/$subdir/fastcall.def" err
|
||||
verbose "$DLLTOOL -p prefix -l tmpdir/libalias.a -d $srcdir/$subdir/alias.def $dlltool_gas_flag" 1
|
||||
catch "exec $DLLTOOL -p prefix -l tmpdir/libalias.a -d $srcdir/$subdir/alias.def $dlltool_gas_flag" err
|
||||
|
||||
if ![string match "" $err] then {
|
||||
send_log "$err\n"
|
||||
verbose "$err" 1
|
||||
fail "dlltool (aliased export)"
|
||||
fail "dlltool -p (execution)"
|
||||
continue
|
||||
}
|
||||
|
||||
pass "dlltool (aliased export)"
|
||||
pass "dlltool -p (execution)"
|
||||
|
||||
set got [binutils_run $NM "tmpdir/libalias.a"]
|
||||
set want "00000000 I __imp__prefix_symbol.*00000000 T _prefix_symbol.*00000000 I __imp__symbol.*00000000 T _symbol"
|
||||
|
||||
if [regexp $want $got] then {
|
||||
pass "dlltool -p (symbol names)"
|
||||
} else {
|
||||
fail "dlltool -p (symbol names)"
|
||||
}
|
||||
|
||||
set got [binutils_run $OBJDUMP "-s -j .idata\$6 tmpdir/libalias.a"]
|
||||
set want "(Contents of section .idata\\\$6:.*\\.\\.symbol\\.\\..*){2,2}"
|
||||
|
||||
if [regexp $want $got] then {
|
||||
pass "dlltool -p (import name)"
|
||||
} else {
|
||||
fail "dlltool -p (import name)"
|
||||
}
|
||||
|
|
|
@ -71,19 +71,28 @@ if ![info exists DLLTOOL] then {
|
|||
|
||||
if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status}
|
||||
|
||||
# Make a symlink from tmpdir/gas/as and tmpdir/gas/ld to the assembler
|
||||
# Make a copy from tmpdir/gas/as and tmpdir/gas/ld to the assembler
|
||||
# and linker in the build tree, so that we can use a -B option to gcc
|
||||
# to force it to use the newly built assembler/linker.
|
||||
if {![file isdirectory tmpdir/gas]} then {
|
||||
catch "exec mkdir tmpdir/gas" status
|
||||
if {[file isfile ../gas/as-new]} then {
|
||||
catch "exec ln -s ../../../gas/as-new tmpdir/gas/as" status
|
||||
send_user "file isfile ../gas/as-new[exe_ext]: [file isfile ../gas/as-new[exe_ext]]\n"
|
||||
if {[file isfile ../gas/as-new[exe_ext]]} then {
|
||||
catch "exec cp ../gas/as-new[exe_ext] tmpdir/gas/as[exe_ext]" status
|
||||
} else {
|
||||
# For non-Windows hosts there may be an executable
|
||||
# without a .exe suffix, so try copying that instead.
|
||||
catch "exec cp ../gas/as-new tmpdir/gas/as[exe_ext]" status
|
||||
}
|
||||
if {[file isfile ../ld/ld-new]} then {
|
||||
catch "exec ln -s ../../../ld/ld-new tmpdir/gas/ld" status
|
||||
# This may not be needed any more...
|
||||
if {[file isfile ../ld/ld-new[exe_ext]]} then {
|
||||
catch "exec cp ../ld/ld-new[exe_ext] tmpdir/gas/ld[exe_ext]" status
|
||||
} else {
|
||||
catch "exec cp ../ld/ld-new tmpdir/gas/ld[exe_ext]" status
|
||||
}
|
||||
}
|
||||
set gcc_gas_flag "-B[pwd]/tmpdir/gas/"
|
||||
set dlltool_gas_flag "-S [pwd]/tmpdir/gas/as[exe_ext]"
|
||||
|
||||
#
|
||||
# binutils_run
|
||||
|
|
|
@ -149,3 +149,15 @@ proc is_elf_format {} {
|
|||
}
|
||||
return 1
|
||||
}
|
||||
|
||||
#
|
||||
# exe_ext
|
||||
# Returns target executable extension, if any.
|
||||
#
|
||||
proc exe_ext {} {
|
||||
if { [istarget *-*-mingw32] || [istarget *-*-cygwin*] } {
|
||||
return ".exe"
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue