/* dlltool.c -- tool to generate stuff for PE style DLLs
- Copyright (C) 1995-2016 Free Software Foundation, Inc.
+ Copyright (C) 1995-2017 Free Software Foundation, Inc.
This file is part of GNU Binutils.
int ordinal;
int constant;
int noname; /* Don't put name in image file. */
- int private; /* Don't put reference in import lib. */
+ int private; /* Don't put reference in import lib. */
int data;
- int hint;
- int forward; /* Number of forward label, 0 means no forward. */
+ int forward; /* Number of forward label, 0 means no forward. */
struct export *next;
}
export_type;
INIT_SEC_DATA (IDATA7, ".idata$7", SEC_HAS_CONTENTS, 2),
INIT_SEC_DATA (IDATA5, ".idata$5", SEC_HAS_CONTENTS, 2),
INIT_SEC_DATA (IDATA4, ".idata$4", SEC_HAS_CONTENTS, 2),
- INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS, 1)
+ INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS, 2)
};
#else
#endif
ptrs[oidx++] = exp_label;
}
+#ifndef DLLTOOL_PPC
+ else
+ {
+ /* PR 20881: Add __nm_<symbol> for the exported library.
+ FIXME: Might be needed for PowerPC, but currently unable to test this. */
+ exp_label = bfd_make_empty_symbol (abfd);
+ exp_label->name = make_imp_label ("__nm_", exp->name);
+ exp_label->section = secdata[IDATA6].sec;
+ exp_label->flags = BSF_GLOBAL;
+ exp_label->value = 0;
+ }
+#endif
/* Generate imp symbols with one underscore for Microsoft
compatibility, and with two underscores for backward
if (create_compat_implib)
ptrs[oidx++] = iname;
ptrs[oidx++] = iname2;
+#ifndef DLLTOOL_PPC
+ /* PR 20881:
+ According to pe-dll.c __nm_<symbol> should be add after __imp_<symbol>. */
+ if (exp->data)
+ ptrs[oidx++] = exp_label;
+#endif
iname_lab_pp = ptrs + oidx;
ptrs[oidx++] = iname_lab;
sec->orelocation = rpp;
break;
}
- /* else fall through */
+ /* Fall through. */
+
case IDATA4:
/* An idata$4 or idata$5 is one word long, and has an
rva to idata$6. */
case IDATA6:
if (!exp->noname)
{
- /* This used to add 1 to exp->hint. I don't know
- why it did that, and it does not match what I see
- in programs compiled with the MS tools. */
- int idx = exp->hint;
+ int idx = exp->ordinal;
+
if (exp->its_name)
si->size = strlen (exp->its_name) + 3;
else
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, delay);
{
/* First work out the minimum ordinal chosen. */
export_type *exp;
-
- int i;
- int hint = 0;
export_type **d_export_vec = xmalloc (sizeof (export_type *) * d_nfuncs);
+ int i;
inform (_("Processing definitions"));
qsort (d_exports_lexically, i, sizeof (export_type *), nfunc);
- /* Fill exp entries with their hint values. */
- for (i = 0; i < d_nfuncs; i++)
- if (!d_exports_lexically[i]->noname || show_allnames)
- d_exports_lexically[i]->hint = hint++;
-
inform (_("Processed definitions"));
}