diff options
Diffstat (limited to 'binutils/dlltool.c')
-rw-r--r-- | binutils/dlltool.c | 324 |
1 files changed, 25 insertions, 299 deletions
diff --git a/binutils/dlltool.c b/binutils/dlltool.c index d22ff54..ed016b9 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -229,7 +229,7 @@ = Array of { short, asciz } entries, one for each imported function. The `short' is the function's ordinal number. - .idata$7 = dll name (eg: "kernel32.dll"). (.idata$6 for ppc). */ + .idata$7 = dll name (eg: "kernel32.dll"). */ #include "sysdep.h" #include "bfd.h" @@ -449,10 +449,6 @@ static const char *mname = "i386"; static const char *mname = "i386:x86-64"; #endif -#ifdef DLLTOOL_DEFAULT_PPC -static const char *mname = "ppc"; -#endif - #ifdef DLLTOOL_DEFAULT_SH static const char *mname = "sh"; #endif @@ -563,28 +559,6 @@ static const unsigned char mcore_le_jtab[] = 0x00, 0x00, 0x00, 0x00 /* <address> */ }; -/* 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. */ -static const unsigned char ppc_jtab[] = -{ - 0x00, 0x00, 0x62, 0x81, /* lwz r11,0(r2) */ - /* Reloc TOCREL16 __imp_xxx */ - 0x00, 0x00, 0x8B, 0x81, /* lwz r12,0(r11) */ - 0x04, 0x00, 0x41, 0x90, /* stw r2,4(r1) */ - 0xA6, 0x03, 0x89, 0x7D, /* mtctr r12 */ - 0x04, 0x00, 0x4B, 0x80, /* lwz r2,4(r11) */ - 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)". */ -static bfd_vma ppc_glue_insn = 0x80410004; -#endif - static const char i386_trampoline[] = "\tpushl %%ecx\n" "\tpushl %%edx\n" @@ -661,16 +635,7 @@ mtable[] = } , { -#define MPPC 2 - "ppc", ".byte", ".short", ".long", ".asciz", "#", - "jmp *", ".global", ".space", ".align\t2",".align\t4", "", - "pe-powerpcle",bfd_arch_powerpc, - ppc_jtab, sizeof (ppc_jtab), 0, - 0, 0, 0, 0, 0, 0 - } - , - { -#define MTHUMB 3 +#define MTHUMB 2 "thumb", ".byte", ".short", ".long", ".asciz", "@", "push\t{r6}\n\tldr\tr6, [pc, #8]\n\tldr\tr6, [r6]\n\tmov\tip, r6\n\tpop\t{r6}\n\tbx\tip", ".global", ".space", ".align\t2",".align\t4", "-mthumb-interwork", @@ -679,7 +644,7 @@ mtable[] = 0, 0, 0, 0, 0, 0 } , -#define MARM_INTERWORK 4 +#define MARM_INTERWORK 3 { "arm_interwork", ".byte", ".short", ".long", ".asciz", "@", "ldr\tip,[pc]\n\tldr\tip,[ip]\n\tbx\tip\n\t.long", @@ -690,7 +655,7 @@ mtable[] = } , { -#define MMCORE_BE 5 +#define MMCORE_BE 4 "mcore-be", ".byte", ".short", ".long", ".asciz", "//", "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", ".global", ".space", ".align\t2",".align\t4", "", @@ -700,7 +665,7 @@ mtable[] = } , { -#define MMCORE_LE 6 +#define MMCORE_LE 5 "mcore-le", ".byte", ".short", ".long", ".asciz", "//", "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", ".global", ".space", ".align\t2",".align\t4", "-EL", @@ -710,7 +675,7 @@ mtable[] = } , { -#define MMCORE_ELF 7 +#define MMCORE_ELF 6 "mcore-elf-be", ".byte", ".short", ".long", ".asciz", "//", "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", ".global", ".space", ".align\t2",".align\t4", "", @@ -720,7 +685,7 @@ mtable[] = } , { -#define MMCORE_ELF_LE 8 +#define MMCORE_ELF_LE 7 "mcore-elf-le", ".byte", ".short", ".long", ".asciz", "//", "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", ".global", ".space", ".align\t2",".align\t4", "-EL", @@ -730,7 +695,7 @@ mtable[] = } , { -#define MARM_WINCE 9 +#define MARM_WINCE 8 "arm-wince", ".byte", ".short", ".long", ".asciz", "@", "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long", ".global", ".space", ".align\t2",".align\t4", "-mapcs-32", @@ -740,7 +705,7 @@ mtable[] = } , { -#define MX86 10 +#define MX86 9 "i386:x86-64", ".byte", ".short", ".long", ".asciz", "#", "jmp *", ".global", ".space", ".align\t2",".align\t4", "", "pe-x86-64",bfd_arch_i386, @@ -888,7 +853,6 @@ rvaafter (int mach) case MARM: case M386: case MX86: - case MPPC: case MTHUMB: case MARM_INTERWORK: case MMCORE_BE: @@ -913,7 +877,6 @@ rvabefore (int mach) case MARM: case M386: case MX86: - case MPPC: case MTHUMB: case MARM_INTERWORK: case MMCORE_BE: @@ -936,7 +899,6 @@ asm_prefix (int mach, const char *name) switch (mach) { case MARM: - case MPPC: case MTHUMB: case MARM_INTERWORK: case MMCORE_BE: @@ -2296,8 +2258,6 @@ typedef struct #define INIT_SEC_DATA(id, name, flags, align) \ { id, name, flags, align, NULL, NULL, NULL, 0, NULL } -#ifndef DLLTOOL_PPC - #define TEXT 0 #define DATA 1 #define BSS 2 @@ -2324,37 +2284,6 @@ static sinfo secdata[NSECS] = INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS, 1) }; -#else - -/* Sections numbered to make the order the same as other PowerPC NT - compilers. This also keeps funny alignment thingies from happening. */ -#define TEXT 0 -#define PDATA 1 -#define RDATA 2 -#define IDATA5 3 -#define IDATA4 4 -#define IDATA6 5 -#define IDATA7 6 -#define DATA 7 -#define BSS 8 - -#define NSECS 9 - -static sinfo secdata[NSECS] = -{ - INIT_SEC_DATA (TEXT, ".text", SEC_CODE | SEC_HAS_CONTENTS, 3), - INIT_SEC_DATA (PDATA, ".pdata", SEC_HAS_CONTENTS, 2), - INIT_SEC_DATA (RDATA, ".reldata", 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 (IDATA7, ".idata$7", SEC_HAS_CONTENTS, 2), - INIT_SEC_DATA (DATA, ".data", SEC_DATA, 2), - INIT_SEC_DATA (BSS, ".bss", 0, 2) -}; - -#endif - /* This is what we're trying to make. We generate the imp symbols with both single and double underscores, for compatibility. @@ -2376,21 +2305,7 @@ __imp_GetFileVersionInfoSizeW@8: # Hint/Name table .section .idata$6 ID2: .short 2 - .asciz "GetFileVersionInfoSizeW" - - - For the PowerPC, here's the variation on the above scheme: - -# Rather than a simple "jmp *", the code to get to the dll function -# looks like: - .text - lwz r11,[tocv]__imp_function_name(r2) -# RELOC: 00000000 TOCREL16,TOCDEFN __imp_function_name - lwz r12,0(r11) - stw r2,4(r1) - mtctr r12 - lwz r2,4(r11) - bctr */ + .asciz "GetFileVersionInfoSizeW" */ static char * make_label (const char *prefix, const char *name) @@ -2438,11 +2353,6 @@ make_one_lib_file (export_type *exp, int i, int delay) asymbol * iname_lab; asymbol ** iname_lab_pp; asymbol ** iname_pp; -#ifdef DLLTOOL_PPC - asymbol ** fn_pp; - asymbol ** toc_pp; -#define EXTRA 2 -#endif #ifndef EXTRA #define EXTRA 0 #endif @@ -2503,18 +2413,7 @@ make_one_lib_file (export_type *exp, int i, int delay) { exp_label = bfd_make_empty_symbol (abfd); exp_label->name = make_imp_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. */ -#ifdef DLLTOOL_PPC - if (machine == MPPC) - exp_label->section = secdata[RDATA].sec; - else -#endif - exp_label->section = secdata[TEXT].sec; - + exp_label->section = secdata[TEXT].sec; exp_label->flags = BSF_GLOBAL; exp_label->value = 0; @@ -2558,36 +2457,6 @@ make_one_lib_file (export_type *exp, int i, int delay) iname_lab_pp = ptrs + oidx; ptrs[oidx++] = iname_lab; -#ifdef DLLTOOL_PPC - /* The symbol referring to the code (.text). */ - { - asymbol *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. */ - { - asymbol *toc_symbol; - - toc_symbol = bfd_make_empty_symbol (abfd); - toc_symbol->name = make_label (".", "toc"); - toc_symbol->section = bfd_und_section_ptr; - toc_symbol->flags = BSF_GLOBAL; - toc_symbol->value = 0; - - toc_pp = ptrs + oidx; - ptrs[oidx++] = toc_symbol; - } -#endif - ptrs[oidx] = 0; for (i = 0; i < NSECS; i++) @@ -2629,13 +2498,7 @@ make_one_lib_file (export_type *exp, int i, int delay) rpp[3] = 0; } - if (machine == MPPC) - { - rel->howto = bfd_reloc_type_lookup (abfd, - BFD_RELOC_16_GOTOFF); - rel->sym_ptr_ptr = iname_pp; - } - else if (machine == MX86) + if (machine == MX86) { rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32_PCREL); @@ -2788,114 +2651,6 @@ make_one_lib_file (export_type *exp, int i, int delay) sec->orelocation = rpp; sec->reloc_count = 1; break; - -#ifdef DLLTOOL_PPC - case PDATA: - { - /* The .pdata section is 5 words long. - Think of it as: - struct - { - bfd_vma BeginAddress, [0x00] - EndAddress, [0x04] - ExceptionHandler, [0x08] - HandlerData, [0x0c] - PrologEndAddress; [0x10] - }; */ - - /* So this pdata section setups up this as a glue linkage to - a dll routine. There are a number of house keeping things - we need to do: - - 1. In the name of glue trickery, the ADDR32 relocs for 0, - 4, and 0x10 are set to point to the same place: - "..function_name". - 2. There is one more reloc needed in the pdata section. - The actual glue instruction to restore the toc on - return is saved as the offset in an IMGLUE reloc. - So we need a total of four relocs for this section. - - 3. Lastly, the HandlerData field is set to 0x03, to indicate - that this is a glue routine. */ - arelent *imglue, *ba_rel, *ea_rel, *pea_rel; - - /* Alignment must be set to 2**2 or you get extra stuff. */ - bfd_set_section_alignment (sec, 2); - - si->size = 4 * 5; - si->data = xmalloc (si->size); - memset (si->data, 0, si->size); - rpp = xmalloc (sizeof (arelent *) * 5); - rpp[0] = imglue = xmalloc (sizeof (arelent)); - rpp[1] = ba_rel = xmalloc (sizeof (arelent)); - rpp[2] = ea_rel = xmalloc (sizeof (arelent)); - rpp[3] = pea_rel = xmalloc (sizeof (arelent)); - rpp[4] = 0; - - /* Stick the toc reload instruction in the glue reloc. */ - bfd_put_32(abfd, ppc_glue_insn, (char *) &imglue->address); - - imglue->addend = 0; - imglue->howto = bfd_reloc_type_lookup (abfd, - BFD_RELOC_32_GOTOFF); - imglue->sym_ptr_ptr = fn_pp; - - ba_rel->address = 0; - ba_rel->addend = 0; - ba_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - ba_rel->sym_ptr_ptr = fn_pp; - - bfd_put_32 (abfd, 0x18, si->data + 0x04); - ea_rel->address = 4; - ea_rel->addend = 0; - ea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - ea_rel->sym_ptr_ptr = fn_pp; - - /* Mark it as glue. */ - bfd_put_32 (abfd, 0x03, si->data + 0x0c); - - /* Mark the prolog end address. */ - bfd_put_32 (abfd, 0x0D, si->data + 0x10); - pea_rel->address = 0x10; - pea_rel->addend = 0; - pea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - pea_rel->sym_ptr_ptr = fn_pp; - - sec->orelocation = rpp; - sec->reloc_count = 4; - break; - } - case RDATA: - /* Each external function in a PowerPC PE file has a two word - descriptor consisting of: - 1. The address of the code. - 2. The address of the appropriate .toc - We use relocs to build this. */ - si->size = 8; - si->data = xmalloc (8); - memset (si->data, 0, si->size); - - rpp = xmalloc (sizeof (arelent *) * 3); - rpp[0] = rel = xmalloc (sizeof (arelent)); - rpp[1] = xmalloc (sizeof (arelent)); - rpp[2] = 0; - - rel->address = 0; - rel->addend = 0; - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - rel->sym_ptr_ptr = fn_pp; - - rel = rpp[1]; - - rel->address = 4; - rel->addend = 0; - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - rel->sym_ptr_ptr = toc_pp; - - sec->orelocation = rpp; - sec->reloc_count = 2; - break; -#endif /* DLLTOOL_PPC */ } } @@ -3134,30 +2889,7 @@ make_tail (void) fprintf (f,"\t%s\t0\n", ASM_LONG); /* NULL terminating list. */ } -#ifdef DLLTOOL_PPC - /* Normally, we need to see a null descriptor built in idata$3 to - act as the terminator for the list. The ideal way, I suppose, - would be to mark this section as a comdat type 2 section, so - only one would appear in the final .exe (if our linker supported - comdat, that is) or cause it to be inserted by something else (say - crt0). */ - - fprintf (f, "\t.section\t.idata$3\n"); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); -#endif - -#ifdef DLLTOOL_PPC - /* Other PowerPC NT compilers use idata$6 for the dllname, so I - do too. Original, huh? */ - fprintf (f, "\t.section\t.idata$6\n"); -#else fprintf (f, "\t.section\t.idata$7\n"); -#endif - fprintf (f, "\t%s\t__%s_iname\n", ASM_GLOBAL, imp_name_lab); fprintf (f, "__%s_iname:\t%s\t\"%s\"\n", imp_name_lab, ASM_TEXT, dll_name); @@ -3463,13 +3195,13 @@ identify_member_contains_symname (bfd * abfd, } /* This is the main implementation for the --identify option. - Given the name of an import library in identify_imp_name, first determine - if the import library is a GNU binutils-style one (where the DLL name is - stored in an .idata$7 (.idata$6 on PPC) section, or if it is a MS-style - one (where the DLL name, along with much other data, is stored in the - .idata$6 section). We determine the style of import library by searching - for the DLL-structure symbol inserted by MS tools: - __NULL_IMPORT_DESCRIPTOR. + Given the name of an import library in identify_imp_name, first + determine if the import library is a GNU binutils-style one (where + the DLL name is stored in an .idata$7 section), or if it is a + MS-style one (where the DLL name, along with much other data, is + stored in the .idata$6 section). We determine the style of import + library by searching for the DLL-structure symbol inserted by MS + tools: __NULL_IMPORT_DESCRIPTOR. Once we know which section to search, evaluate each section for the appropriate properties that indicate it may contain the name of the @@ -3629,19 +3361,13 @@ identify_search_member (bfd *abfd, } /* This predicate returns true if section->name matches the desired value. - By default, this is .idata$7 (.idata$6 on PPC, or if the import - library is ms-style). */ + By default, this is .idata$7 (.idata$6 if the import library is + ms-style). */ static bfd_boolean identify_process_section_p (asection * section, bfd_boolean ms_style_implib) { - static const char * SECTION_NAME = -#ifdef DLLTOOL_PPC - /* dllname is stored in idata$6 on PPC */ - ".idata$6"; -#else - ".idata$7"; -#endif + static const char * SECTION_NAME = ".idata$7"; static const char * MS_SECTION_NAME = ".idata$6"; const char * section_name = @@ -3652,7 +3378,7 @@ identify_process_section_p (asection * section, bfd_boolean ms_style_implib) return FALSE; } -/* If *section has contents and its name is .idata$7 (.data$6 on PPC or if +/* If *section has contents and its name is .idata$7 (.idata$6 if import lib ms-generated) -- and it satisfies several other constraints -- then add the contents of the section to obj->list. */ @@ -3938,7 +3664,7 @@ usage (FILE *file, int status) fprintf (file, _("Usage %s <option(s)> <object-file(s)>\n"), program_name); /* xgetext:c-format */ fprintf (file, _(" -m --machine <machine> Create as DLL for <machine>. [default: %s]\n"), mname); - fprintf (file, _(" possible <machine>: arm[_interwork], i386, mcore[-elf]{-le|-be}, ppc, thumb\n")); + fprintf (file, _(" possible <machine>: arm[_interwork], i386, mcore[-elf]{-le|-be}, thumb\n")); fprintf (file, _(" -e --output-exp <outname> Generate an export file.\n")); fprintf (file, _(" -l --output-lib <outname> Generate an interface library.\n")); fprintf (file, _(" -y --output-delaylib <outname> Create a delay-import library.\n")); @@ -4372,7 +4098,7 @@ look_for_prog (const char *prog_name, const char *prefix, int end_prefix) /* Deduce the name of the program we are want to invoke. PROG_NAME is the basic name of the program we want to run, eg "as" or "ld". The catch is that we might want actually - run "i386-pe-as" or "ppc-pe-ld". + run "i386-pe-as". If argv[0] contains the full path, then try to find the program in the same place, with and then without a target-like prefix. |