diff options
Diffstat (limited to 'contrib/binutils/binutils/dlltool.c')
-rw-r--r-- | contrib/binutils/binutils/dlltool.c | 614 |
1 files changed, 348 insertions, 266 deletions
diff --git a/contrib/binutils/binutils/dlltool.c b/contrib/binutils/binutils/dlltool.c index c5530bd..1253f9f 100644 --- a/contrib/binutils/binutils/dlltool.c +++ b/contrib/binutils/binutils/dlltool.c @@ -1,5 +1,5 @@ /* dlltool.c -- tool to generate stuff for PE style DLLs - Copyright (C) 1995, 96, 1997 Free Software Foundation, Inc. + Copyright (C) 1995, 96, 97, 1998 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -15,7 +15,8 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ /* @@ -46,7 +47,7 @@ LIBRARY <name> [ , <base> ] The result is going to be <name>.DLL - EXPORTS ( <name1> [ = <name2> ] [ @ <integer> ] [ NONAME ] [CONSTANT] ) * + EXPORTS ( <name1> [ = <name2> ] [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) * Declares name1 as an exported symbol from the DLL, with optional ordinal number <integer> @@ -201,7 +202,6 @@ */ /* AIX requires this to be the first thing in the file. */ -/* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # ifdef _AIX #pragma alloca @@ -217,10 +217,15 @@ #include "bucomm.h" #include "getopt.h" #include "demangle.h" +#include "dlltool.h" + #include <ctype.h> +#include <time.h> + #ifdef HAVE_SYS_WAIT_H #include <sys/wait.h> -#else +#else /* ! HAVE_SYS_WAIT_H */ +#if ! defined (_WIN32) || defined (__CYGWIN32__) #ifndef WIFEXITED #define WIFEXITED(w) (((w)&0377) == 0) #endif @@ -233,13 +238,23 @@ #ifndef WEXITSTATUS #define WEXITSTATUS(w) (((w) >> 8) & 0377) #endif +#else /* defined (_WIN32) && ! defined (__CYGWIN32__) */ +#ifndef WIFEXITED +#define WIFEXITED(w) (((w) & 0xff) == 0) #endif - -#ifdef HAVE_VFORK_H -#include <vfork.h> +#ifndef WIFSIGNALED +#define WIFSIGNALED(w) (((w) & 0xff) != 0 && ((w) & 0xff) != 0x7f) +#endif +#ifndef WTERMSIG +#define WTERMSIG(w) ((w) & 0x7f) #endif +#ifndef WEXITSTATUS +#define WEXITSTATUS(w) (((w) & 0xff00) >> 8) +#endif +#endif /* defined (_WIN32) && ! defined (__CYGWIN32__) */ +#endif /* ! HAVE_SYS_WAIT_H */ -char *as_name = "as"; +static char *as_name = "as"; static int no_idata4; static int no_idata5; @@ -253,49 +268,50 @@ static int add_indirect = 0; static int add_underscore = 0; static int dontdeltemps = 0; -int yyparse(); -int yydebug; static char *def_file; static char *program_name; -char *strrchr (); -char *strdup (); static int machine; -int killat; +static int killat; static int verbose; -FILE *output_def; -FILE *base_file; +static FILE *output_def; +static FILE *base_file; #ifdef DLLTOOL_ARM -static char *mname = "arm"; +static const char *mname = "arm"; #endif #ifdef DLLTOOL_I386 -static char *mname = "i386"; +static const char *mname = "i386"; #endif #ifdef DLLTOOL_PPC -static char *mname = "ppc"; +static const char *mname = "ppc"; #endif #define PATHMAX 250 /* What's the right name for this ? */ /* This bit of assemly does jmp * .... s set how_jtab_roff to mark where the 32bit abs branch should go */ -unsigned char i386_jtab[] = { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90}; - +static const unsigned char i386_jtab[] = +{ + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 +}; -unsigned char arm_jtab[] = { 0x00, 0xc0, 0x9f, 0xe5, - 0x00, 0xf0, 0x9c, 0xe5, - 0, 0, 0, 0}; +static const unsigned char arm_jtab[] = +{ + 0x00, 0xc0, 0x9f, 0xe5, + 0x00, 0xf0, 0x9c, 0xe5, + 0, 0, 0, 0 +}; /* This is the glue sequence for PowerPC PE. There is a */ /* tocrel16-tocdefn reloc against the first instruction. */ /* We also need a IMGLUE reloc against the glue function */ /* to restore the toc saved by the third instruction in */ /* the glue. */ -unsigned char ppc_jtab[] = +static const unsigned char ppc_jtab[] = { 0x00, 0x00, 0x62, 0x81, /* lwz r11,0(r2) */ /* Reloc TOCREL16 __imp_xxx */ @@ -306,33 +322,35 @@ unsigned char ppc_jtab[] = 0x20, 0x04, 0x80, 0x4E /* bctr */ }; +#ifdef DLLTOOL_PPC /* the glue instruction, picks up the toc from the stw in */ /* the above code: "lwz r2,4(r1)" */ -bfd_vma ppc_glue_insn = 0x80410004; +static bfd_vma ppc_glue_insn = 0x80410004; +#endif +static char outfile[PATHMAX]; -char outfile[PATHMAX]; struct mac { - char *type; - char *how_byte; - char *how_short; - char *how_long; - char *how_asciz; - char *how_comment; - char *how_jump; - char *how_global; - char *how_space; - char *how_align_short; - char *how_align_long; - char *how_bfd_target; + const char *type; + const char *how_byte; + const char *how_short; + const char *how_long; + const char *how_asciz; + const char *how_comment; + const char *how_jump; + const char *how_global; + const char *how_space; + const char *how_align_short; + const char *how_align_long; + const char *how_bfd_target; enum bfd_architecture how_bfd_arch; - unsigned char *how_jtab; + const unsigned char *how_jtab; int how_jtab_size; /* size of the jtab entry */ int how_jtab_roff; /* offset into it for the ind 32 reloc into idata 5 */ - } -mtable[] -= + }; + +static const struct mac mtable[] = { { #define MARM 0 @@ -357,8 +375,56 @@ mtable[] { 0} }; +typedef struct dlist +{ + char *text; + struct dlist *next; +} +dlist_type; + +typedef struct export + { + const char *name; + const char *internal_name; + int ordinal; + int constant; + int noname; + int data; + int hint; + struct export *next; + } +export_type; -char * +static const char *rvaafter PARAMS ((int)); +static const char *rvabefore PARAMS ((int)); +static const char *asm_prefix PARAMS ((int)); +static void run PARAMS ((const char *, char *)); +static void basenames PARAMS ((bfd *)); +static void scan_open_obj_file PARAMS ((bfd *)); +static void scan_obj_file PARAMS ((const char *)); +static void dump_def_info PARAMS ((FILE *)); +static int sfunc PARAMS ((const void *, const void *)); +static void flush_page PARAMS ((FILE *, long *, int, int)); +static void gen_def_file PARAMS ((void)); +static void gen_exp_file PARAMS ((void)); +static const char *xlate PARAMS ((const char *)); +static void dump_iat PARAMS ((FILE *, export_type *)); +static char *make_label PARAMS ((const char *, const char *)); +static bfd *make_one_lib_file PARAMS ((export_type *, int)); +static bfd *make_head PARAMS ((void)); +static bfd *make_tail PARAMS ((void)); +static void gen_lib_file PARAMS ((void)); +static int pfunc PARAMS ((const void *, const void *)); +static int nfunc PARAMS ((const void *, const void *)); +static void remove_null_names PARAMS ((export_type **)); +static void dtab PARAMS ((export_type **)); +static void process_duplicates PARAMS ((export_type **)); +static void fill_ordinals PARAMS ((export_type **)); +static int alphafunc PARAMS ((const void *, const void *)); +static void mangle_defs PARAMS ((void)); +static void usage PARAMS ((FILE *, int)); + +static const char * rvaafter (machine) int machine; { @@ -371,10 +437,10 @@ rvaafter (machine) case MPPC: return ""; } -return ""; + return ""; } -char * +static const char * rvabefore (machine) int machine; { @@ -387,12 +453,12 @@ rvabefore (machine) case MPPC: return ".rva\t"; } -return ""; + return ""; } -char * +static const char * asm_prefix (machine) -int machine; + int machine; { switch (machine) { @@ -403,8 +469,9 @@ int machine; case MPPC: return ""; } -return ""; + return ""; } + #define ASM_BYTE mtable[machine].how_byte #define ASM_SHORT mtable[machine].how_short #define ASM_LONG mtable[machine].how_long @@ -425,12 +492,9 @@ return ""; #define HOW_JTAB_ROFF mtable[machine].how_jtab_roff static char **oav; - -FILE *yyin; /* communications with flex */ -extern int linenumber; void process_def_file (name) - char *name; + const char *name; { FILE *f = fopen (name, FOPEN_RT); if (!f) @@ -448,27 +512,7 @@ process_def_file (name) /* Communications with the parser */ - -typedef struct dlist -{ - char *text; - struct dlist *next; -} -dlist_type; - -typedef struct export - { - char *name; - char *internal_name; - int ordinal; - int constant; - int noname; - int hint; - struct export *next; - } -export_type; - -static char *d_name; /* Arg to NAME or LIBRARY */ +static const char *d_name; /* Arg to NAME or LIBRARY */ static int d_nfuncs; /* Number of functions exported */ static int d_named_nfuncs; /* Number of named functions exported */ static int d_low_ord; /* Lowest ordinal index */ @@ -482,7 +526,8 @@ static int d_is_dll; static int d_is_exe; int -yyerror () +yyerror (err) + const char *err; { fprintf (stderr, "%s: Syntax error in def file %s:%d\n", program_name, def_file, linenumber); @@ -490,12 +535,13 @@ yyerror () } void -def_exports (name, internal_name, ordinal, noname, constant) - char *name; - char *internal_name; +def_exports (name, internal_name, ordinal, noname, constant, data) + const char *name; + const char *internal_name; int ordinal; int noname; int constant; + int data; { struct export *p = (struct export *) xmalloc (sizeof (*p)); @@ -504,15 +550,15 @@ def_exports (name, internal_name, ordinal, noname, constant) p->ordinal = ordinal; p->constant = constant; p->noname = noname; + p->data = data; p->next = d_exports; d_exports = p; d_nfuncs++; } - void def_name (name, base) - char *name; + const char *name; int base; { if (verbose) @@ -527,7 +573,7 @@ def_name (name, base) void def_library (name, base) - char *name; + const char *name; int base; { if (verbose) @@ -542,10 +588,10 @@ def_library (name, base) void def_description (desc) - char *desc; + const char *desc; { dlist_type *d = (dlist_type *) xmalloc (sizeof (dlist_type)); - d->text = strdup (desc); + d->text = xstrdup (desc); d->next = d_list; d_list = d; } @@ -555,7 +601,7 @@ new_directive (dir) char *dir; { dlist_type *d = (dlist_type *) xmalloc (sizeof (dlist_type)); - d->text = strdup (dir); + d->text = xstrdup (dir); d->next = a_list; a_list = d; } @@ -570,7 +616,7 @@ def_stacksize (reserve, commit) sprintf (b, "-stack 0x%x,0x%x ", reserve, commit); else sprintf (b, "-stack 0x%x ", reserve); - new_directive (strdup (b)); + new_directive (xstrdup (b)); } void @@ -583,15 +629,14 @@ def_heapsize (reserve, commit) sprintf (b, "-heap 0x%x,0x%x ", reserve, commit); else sprintf (b, "-heap 0x%x ", reserve); - new_directive (strdup (b)); + new_directive (xstrdup (b)); } - void def_import (internal, module, entry) - char *internal; - char *module; - char *entry; + const char *internal; + const char *module; + const char *entry; { if (verbose) fprintf (stderr, "%s: IMPORTS are ignored", program_name); @@ -599,16 +644,15 @@ def_import (internal, module, entry) void def_version (major, minor) -int major; -int minor; + int major; + int minor; { printf ("VERSION %d.%d\n", major, minor); } - void def_section (name, attr) - char *name; + const char *name; int attr; { char buf[200]; @@ -625,8 +669,9 @@ def_section (name, attr) *d++ = 'S'; *d++ = 0; sprintf (buf, "-attr %s %s", name, atts); - new_directive (strdup (buf)); + new_directive (xstrdup (buf)); } + void def_code (attr) int attr; @@ -642,19 +687,20 @@ def_data (attr) def_section ("DATA", attr); } - /**********************************************************************/ -void +static void run (what, args) - char *what; + const char *what; char *args; { char *s; - int pid; + int pid, wait_status; int i; - char **argv; - extern char **environ; + const char **argv; + char *errmsg_fmt, *errmsg_arg; + char *temp_base = choose_temp_base (); + if (verbose) fprintf (stderr, "%s %s\n", what, args); @@ -677,44 +723,41 @@ run (what, args) break; *s++ = 0; } - argv[i++] = 0; + argv[i++] = NULL; + pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base, + &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); - pid = vfork (); + if (pid == -1) + { + int errno_val = errno; - if (pid == 0) + fprintf (stderr, "%s: ", program_name); + fprintf (stderr, errmsg_fmt, errmsg_arg); + fprintf (stderr, ": %s\n", strerror (errno_val)); + exit (1); + } + + pid = pwait (pid, &wait_status, 0); + if (pid == -1) { - execvp (what, argv); - fprintf (stderr, "%s: can't exec %s\n", program_name, what); + fprintf (stderr, "%s: wait: %s\n", program_name, strerror (errno)); exit (1); } - else if (pid == -1) + else if (WIFSIGNALED (wait_status)) { - extern int errno; - fprintf (stderr, "%s: vfork failed, %d\n", program_name, errno); + fprintf (stderr, "%s: subprocess got fatal signal %d\n", + program_name, WTERMSIG (wait_status)); exit (1); } - else + else if (WIFEXITED (wait_status)) { - int status; - waitpid (pid, &status, 0); - if (status) - { - if (WIFSIGNALED (status)) - { - fprintf (stderr, "%s: %s %s terminated with signal %d\n", - program_name, what, args, WTERMSIG (status)); - exit (1); - } - - if (WIFEXITED (status)) - { - fprintf (stderr, "%s: %s %s terminated with exit status %d\n", - program_name, what, args, WEXITSTATUS (status)); - exit (1); - } - } + if (WEXITSTATUS (wait_status) != 0) + fprintf (stderr, "%s: %s exited with status %d\n", + program_name, what, WEXITSTATUS (wait_status)); } + else + abort (); } /* read in and block out the base relocations */ @@ -722,13 +765,9 @@ static void basenames (abfd) bfd *abfd; { - - - - } -void +static void scan_open_obj_file (abfd) bfd *abfd; { @@ -766,7 +805,7 @@ scan_open_obj_file (abfd) /* FIXME: The 5th arg is for the `constant' field. What should it be? Not that it matters since it's not currently useful. */ - def_exports (c, 0, -1, 0, 0); + def_exports (c, 0, -1, 0, 0, 0); } else p++; @@ -781,10 +820,9 @@ scan_open_obj_file (abfd) program_name); } - -void +static void scan_obj_file (filename) - char *filename; + const char *filename; { bfd *f = bfd_openr (filename, 0); @@ -816,9 +854,7 @@ scan_obj_file (filename) /**********************************************************************/ - - -void +static void dump_def_info (f) FILE *f; { @@ -830,32 +866,32 @@ dump_def_info (f) fprintf (f, "\n"); for (i = 0, exp = d_exports; exp; i++, exp = exp->next) { - fprintf (f, "%s %d = %s %s @ %d %s%s\n", + fprintf (f, "%s %d = %s %s @ %d %s%s%s\n", ASM_C, i, exp->name, exp->internal_name, exp->ordinal, exp->noname ? "NONAME " : "", - exp->constant ? "CONSTANT" : ""); + exp->constant ? "CONSTANT" : "", + exp->data ? "DATA" : ""); } } + /* Generate the .exp file */ -int +static int sfunc (a, b) - long *a; - long *b; + const void *a; + const void *b; { - return *a - *b; + return *(const long *) a - *(const long *) b; } - - static void flush_page (f, need, page_addr, on_page) FILE *f; - int *need; + long *need; int page_addr; int on_page; { @@ -872,16 +908,14 @@ flush_page (f, need, page_addr, on_page) ASM_C); for (i = 0; i < on_page; i++) { - fprintf (f, "\t%s\t0x%x\n", ASM_SHORT, (need[i] - page_addr) | 0x3000); + fprintf (f, "\t%s\t0x%lx\n", ASM_SHORT, (need[i] - page_addr) | 0x3000); } /* And padding */ if (on_page & 1) fprintf (f, "\t%s\t0x%x\n", ASM_SHORT, 0 | 0x0000); - } - -void +static void gen_def_file () { int i; @@ -896,16 +930,18 @@ gen_def_file () for (i = 0, exp = d_exports; exp; i++, exp = exp->next) { char *quote = strchr (exp->name, '.') ? "\"" : ""; - fprintf (output_def, "\t%s%s%s @ %d%s ; %s\n", + fprintf (output_def, "\t%s%s%s @ %d%s%s ; %s\n", quote, exp->name, quote, exp->ordinal, exp->noname ? " NONAME" : "", + exp->data ? " DATA" : "", cplus_demangle (exp->internal_name, DMGL_ANSI | DMGL_PARAMS)); } } -void + +static void gen_exp_file () { FILE *f; @@ -937,7 +973,8 @@ gen_exp_file () { fprintf (f, "\t.section .edata\n\n"); fprintf (f, "\t%s 0 %s Allways 0\n", ASM_LONG, ASM_C); - fprintf (f, "\t%s 0x%x %s Time and date\n", ASM_LONG, time(0),ASM_C); + fprintf (f, "\t%s 0x%lx %s Time and date\n", ASM_LONG, (long) time(0), + ASM_C); fprintf (f, "\t%s 0 %s Major and Minor version\n", ASM_LONG, ASM_C); fprintf (f, "\t%sname%s %s Ptr to name of dll\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C); fprintf (f, "\t%s %d %s Starting ordinal of exports\n", ASM_LONG, d_low_ord, ASM_C); @@ -1060,8 +1097,13 @@ gen_exp_file () for (i = 0, exp = d_exports; exp; i++, exp = exp->next) if (!exp->noname || show_allnames) { + /* We use a single underscore for MS compatibility, and a + double underscore for backward compatibility with old + cygwin releases. */ fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name); + fprintf (f, "\t%s\t_imp__%s\n", ASM_GLOBAL, exp->name); fprintf (f, "__imp_%s:\n", exp->name); + fprintf (f, "_imp__%s:\n", exp->name); fprintf (f, "\t%s\t%s\n", ASM_LONG, exp->name); } } @@ -1091,7 +1133,6 @@ gen_exp_file () fprintf (f, "\t.section\t.reloc\n"); if (num_entries) { - int src; int dst = 0; int last = -1; @@ -1135,8 +1176,9 @@ gen_exp_file () } } -static char * -xlate (char *name) +static const char * +xlate (name) + const char *name; { if (add_underscore) { @@ -1158,9 +1200,10 @@ xlate (char *name) /**********************************************************************/ -static void dump_iat (f, exp) -FILE *f; -export_type *exp; +static void +dump_iat (f, exp) + FILE *f; + export_type *exp; { if (exp->noname && !show_allnames ) { @@ -1176,8 +1219,6 @@ export_type *exp; } } - - typedef struct { int id; @@ -1191,7 +1232,6 @@ typedef struct unsigned char *data; } sinfo; - #ifndef DLLTOOL_PPC #define TEXT 0 @@ -1201,12 +1241,9 @@ typedef struct #define IDATA5 4 #define IDATA4 5 #define IDATA6 6 -#define PDATA 7 -#define RDATA 8 #define NSECS 7 - static sinfo secdata[NSECS] = { { TEXT, ".text", SEC_CODE | SEC_HAS_CONTENTS, 2}, @@ -1250,7 +1287,8 @@ static sinfo secdata[NSECS] = #endif /* -This is what we're trying to make +This is what we're trying to make. We generate the imp symbols with +both single and double underscores, for compatibility. .text .global _GetFileVersionInfoSizeW@8 @@ -1314,6 +1352,7 @@ make_one_lib_file (exp, i) fprintf (f, "\t.text\n"); fprintf (f, "\t%s\t%s%s\n", ASM_GLOBAL, ASM_PREFIX, exp->name); fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name); + fprintf (f, "\t%s\t_imp__%s\n", ASM_GLOBAL, exp->name); fprintf (f, "%s%s:\n\t%s\t__imp_%s\n", ASM_PREFIX, exp->name, ASM_JUMP, exp->name); @@ -1325,6 +1364,7 @@ make_one_lib_file (exp, i) fprintf (f, "\t.section .idata$5\n"); fprintf (f, "__imp_%s:\n", exp->name); + fprintf (f, "_imp__%s:\n", exp->name); dump_iat (f, exp); @@ -1355,7 +1395,7 @@ make_one_lib_file (exp, i) bfd *abfd; asymbol *exp_label; - asymbol *iname; + asymbol *iname, *iname2; asymbol *iname_lab; asymbol **iname_lab_pp; asymbol **iname_pp; @@ -1367,13 +1407,12 @@ make_one_lib_file (exp, i) #define EXTRA 0 #endif - asymbol *function_name; /* ".." functionName */ +#ifdef DLLTOOL_PPC asymbol **fn_pp; - asymbol *toc_symbol; /* The .toc symbol */ asymbol **toc_pp; +#endif - /* one symbol for each section, 2 extra + a null */ - asymbol *ptrs[NSECS+3+EXTRA+1]; + asymbol *ptrs[NSECS + 4 + EXTRA + 1]; char *outname = xmalloc (10); int oidx = 0; @@ -1410,33 +1449,48 @@ make_one_lib_file (exp, i) si->sym->value = 0; ptrs[oidx] = si->sym; si->sympp = ptrs + oidx; + si->size = 0; + si->data = NULL; oidx++; } - exp_label = bfd_make_empty_symbol(abfd); - exp_label->name = make_label ("",exp->name); + if (! exp->data) + { + exp_label = bfd_make_empty_symbol (abfd); + exp_label->name = make_label ("", exp->name); - /* On PowerPC, the function name points to a descriptor in the - rdata section, the first element of which is a pointer to the - code (..function_name), and the second points to the .toc - */ - if (machine == MPPC) - exp_label->section = secdata[RDATA].sec; - else - exp_label->section = secdata[TEXT].sec; + /* On PowerPC, the function name points to a descriptor in + the rdata section, the first element of which is a + pointer to the code (..function_name), and the second + points to the .toc */ +#ifdef DLLTOOL_PPC + if (machine == MPPC) + exp_label->section = secdata[RDATA].sec; + else +#endif + exp_label->section = secdata[TEXT].sec; - exp_label->flags = BSF_GLOBAL; - exp_label->value = 0; + exp_label->flags = BSF_GLOBAL; + exp_label->value = 0; - ptrs[oidx++] = exp_label; + ptrs[oidx++] = exp_label; + } + /* Generate imp symbols with one underscore for Microsoft + compatibility, and with two underscores for backward + compatibility with old versions of cygwin. */ iname = bfd_make_empty_symbol(abfd); iname->name = make_label ("__imp_", exp->name); iname->section = secdata[IDATA5].sec; iname->flags = BSF_GLOBAL; iname->value = 0; + iname2 = bfd_make_empty_symbol(abfd); + iname2->name = make_label ("_imp__", exp->name); + iname2->section = secdata[IDATA5].sec; + iname2->flags = BSF_GLOBAL; + iname2->value = 0; iname_lab = bfd_make_empty_symbol(abfd); @@ -1448,30 +1502,39 @@ make_one_lib_file (exp, i) iname_pp = ptrs + oidx; ptrs[oidx++] = iname; + ptrs[oidx++] = iname2; iname_lab_pp = ptrs + oidx; ptrs[oidx++] = iname_lab; #ifdef DLLTOOL_PPC /* The symbol refering to the code (.text) */ - function_name = bfd_make_empty_symbol(abfd); - function_name->name = make_label ("..", exp->name); - function_name->section = secdata[TEXT].sec; - function_name->flags = BSF_GLOBAL; - function_name->value = 0; + { + asymbol *function_name; - fn_pp = ptrs + oidx; - ptrs[oidx++] = function_name; + function_name = bfd_make_empty_symbol(abfd); + function_name->name = make_label ("..", exp->name); + function_name->section = secdata[TEXT].sec; + function_name->flags = BSF_GLOBAL; + function_name->value = 0; + + fn_pp = ptrs + oidx; + ptrs[oidx++] = function_name; + } /* The .toc symbol */ - toc_symbol = bfd_make_empty_symbol(abfd); - toc_symbol->name = make_label (".", "toc"); - toc_symbol->section = (asection *)&bfd_und_section; - toc_symbol->flags = BSF_GLOBAL; - toc_symbol->value = 0; - - toc_pp = ptrs + oidx; - ptrs[oidx++] = toc_symbol; + { + asymbol *toc_symbol; /* The .toc symbol */ + + toc_symbol = bfd_make_empty_symbol(abfd); + toc_symbol->name = make_label (".", "toc"); + toc_symbol->section = (asection *)&bfd_und_section; + toc_symbol->flags = BSF_GLOBAL; + toc_symbol->value = 0; + + toc_pp = ptrs + oidx; + ptrs[oidx++] = toc_symbol; + } #endif ptrs[oidx] = 0; @@ -1486,31 +1549,34 @@ make_one_lib_file (exp, i) switch (i) { case TEXT: - si->size = HOW_JTAB_SIZE; - si->data = xmalloc (HOW_JTAB_SIZE); - memcpy (si->data, HOW_JTAB, HOW_JTAB_SIZE); + if (! exp->data) + { + si->size = HOW_JTAB_SIZE; + si->data = xmalloc (HOW_JTAB_SIZE); + memcpy (si->data, HOW_JTAB, HOW_JTAB_SIZE); - /* add the reloc into idata$5 */ - rel = xmalloc (sizeof (arelent)); - rpp = xmalloc (sizeof (arelent *) * 2); - rpp[0] = rel; - rpp[1] = 0; - rel->address = HOW_JTAB_ROFF; - rel->addend = 0; + /* add the reloqc into idata$5 */ + rel = xmalloc (sizeof (arelent)); + rpp = xmalloc (sizeof (arelent *) * 2); + rpp[0] = rel; + rpp[1] = 0; + rel->address = HOW_JTAB_ROFF; + rel->addend = 0; - if (machine == MPPC) - { - rel->howto = bfd_reloc_type_lookup (abfd, - BFD_RELOC_16_GOTOFF); - rel->sym_ptr_ptr = iname_pp; - } - else - { - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - rel->sym_ptr_ptr = secdata[IDATA5].sympp; + if (machine == MPPC) + { + rel->howto = bfd_reloc_type_lookup (abfd, + BFD_RELOC_16_GOTOFF); + rel->sym_ptr_ptr = iname_pp; + } + else + { + rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); + rel->sym_ptr_ptr = secdata[IDATA5].sympp; + } + sec->orelocation = rpp; + sec->reloc_count = 1; } - sec->orelocation = rpp; - sec->reloc_count = 1; break; case IDATA4: case IDATA5: @@ -1547,7 +1613,10 @@ make_one_lib_file (exp, i) case IDATA6: if (!exp->noname) { - int idx = exp->hint + 1; + /* 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; si->size = strlen (xlate (exp->name)) + 3; si->data = xmalloc (si->size); si->data[0] = idx & 0xff; @@ -1570,6 +1639,7 @@ make_one_lib_file (exp, i) sec->reloc_count = 1; break; +#ifdef DLLTOOL_PPC case PDATA: { /* The .pdata section is 5 words long. */ @@ -1655,7 +1725,7 @@ make_one_lib_file (exp, i) */ si->size = 8; - si->data =xmalloc(8); + si->data = xmalloc (8); memset (si->data, 0, si->size); rpp = xmalloc (sizeof (arelent *) * 3); @@ -1678,6 +1748,7 @@ make_one_lib_file (exp, i) sec->orelocation = rpp; sec->reloc_count = 2; break; +#endif /* DLLTOOL_PPC */ } } @@ -1718,9 +1789,8 @@ make_one_lib_file (exp, i) } - static bfd * -make_head() +make_head () { FILE * f = fopen ("dh.s", FOPEN_WT); @@ -1772,7 +1842,7 @@ make_head() } static bfd * -make_tail() +make_tail () { FILE * f = fopen ("dt.s", FOPEN_WT); @@ -1866,8 +1936,17 @@ gen_lib_file () ar_tail->next = ar_head; head = ar_tail; - bfd_set_archive_head (outarch, head); - bfd_close (outarch); + if (! bfd_set_archive_head (outarch, head)) + bfd_fatal ("bfd_set_archive_head"); + if (! bfd_close (outarch)) + bfd_fatal (imp_name); + + while (head != NULL) + { + bfd *n = head->next; + bfd_close (head); + head = n; + } /* Delete all the temp files */ @@ -1884,21 +1963,25 @@ gen_lib_file () } if (dontdeltemps < 2) - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) - { - sprintf (outfile, "ds%d.o",i); - unlink (outfile); - } - + { + for (i = 0, exp = d_exports; exp; i++, exp = exp->next) + { + sprintf (outfile, "ds%d.o",i); + if (unlink (outfile) < 0) + fprintf (stderr, "%s: cannot delete %s: %s\n", program_name, + outfile, strerror (errno)); + } + } } + /**********************************************************************/ /* Run through the information gathered from the .o files and the .def file and work out the best stuff */ -int +static int pfunc (a, b) - void *a; - void *b; + const void *a; + const void *b; { export_type *ap = *(export_type **) a; export_type *bp = *(export_type **) b; @@ -1913,11 +1996,10 @@ pfunc (a, b) return (ap->ordinal - bp->ordinal); } - -int +static int nfunc (a, b) - void *a; - void *b; + const void *a; + const void *b; { export_type *ap = *(export_type **) a; export_type *bp = *(export_type **) b; @@ -1925,8 +2007,7 @@ nfunc (a, b) return (strcmp (ap->name, bp->name)); } -static -void +static void remove_null_names (ptr) export_type **ptr; { @@ -1953,10 +2034,11 @@ dtab (ptr) { if (ptr[i]) { - printf ("%d %s @ %d %s%s\n", + printf ("%d %s @ %d %s%s%s\n", i, ptr[i]->name, ptr[i]->ordinal, ptr[i]->noname ? "NONAME " : "", - ptr[i]->constant ? "CONSTANT" : ""); + ptr[i]->constant ? "CONSTANT" : "", + ptr[i]->data ? "DATA" : ""); } else printf ("empty\n"); @@ -2005,6 +2087,7 @@ process_duplicates (d_export_vec) b->ordinal = a->ordinal > 0 ? a->ordinal : b->ordinal; b->constant |= a->constant; b->noname |= a->noname; + b->data |= a->data; d_export_vec[i] = 0; } @@ -2101,17 +2184,18 @@ fill_ordinals (d_export_vec) } } -int alphafunc(av,bv) -void *av; -void *bv; +static int +alphafunc (av,bv) + const void *av; + const void *bv; { - export_type **a = av; - export_type **b = bv; + const export_type **a = (const export_type **) av; + const export_type **b = (const export_type **) bv; return strcmp ((*a)->name, (*b)->name); } -void +static void mangle_defs () { /* First work out the minimum ordinal chosen */ @@ -2160,14 +2244,9 @@ mangle_defs () } - - - - - /**********************************************************************/ -void +static void usage (file, status) FILE *file; int status; @@ -2193,7 +2272,7 @@ usage (file, status) #define OPTION_NO_IDATA4 'x' #define OPTION_NO_IDATA5 'c' -static struct option long_options[] = +static const struct option long_options[] = { {"nodelete", no_argument, NULL, 'n'}, {"dllname", required_argument, NULL, 'D'}, @@ -2213,8 +2292,6 @@ static struct option long_options[] = {0} }; - - int main (ac, av) int ac; @@ -2270,7 +2347,11 @@ main (ac, av) verbose = 1; break; case 'y': +#if 0 + /* We don't currently define YYDEBUG when building + defparse.y. */ yydebug = 1; +#endif break; case 'U': add_underscore = 1; @@ -2342,8 +2423,9 @@ main (ac, av) { /* Make imp_name safe for use as a label. */ char *p; - imp_name_lab = strdup (imp_name); - for (p = imp_name_lab; *p; *p++) + + imp_name_lab = xstrdup (imp_name); + for (p = imp_name_lab; *p; p++) { if (!isalpha (*p) && !isdigit (*p)) *p = '_'; |