[patch binutils]: Fix PR/13682 for dlltool
xunxun
xunxun1982@gmail.com
Sun Feb 19 04:48:00 GMT 2012
äº 2012/2/15 18:37, Kai Tietz åé:
> Hi,
>
> this patch adds delayed-load-library feature for x64 Windows targets.
> As this feature is dependent to used runtime, I omitted here a special
> testcase (as was done for x86 Windows).
>
> ChangeLog binutils
>
> 2012-02-15 Kai Tietz<ktietz@redhat.com>
>
> PR binutils/13682
> * NEWS: Mention new feature.
> * dlltool.c (i386_x64_dljtab): New stub-code for x64
> delayed-load feature.
> (i386_x64_trampoline): New trampoline-code for x64
> delayed-load feature.
> (make_one_lib_file): Add support for x64 delayed-load
> feature.
> (make_delay_head): Likewise.
>
> Tested for i686-w64-mingw32, and x86_64-w64-mingw32. Also checked for
> regressions for i686-pc-cygwin.
> Ok for apply?
>
> Regards,
> Kai
>
> Index: binutils/NEWS
> ===================================================================
> RCS file: /cvs/src/src/binutils/NEWS,v
> retrieving revision 1.106
> diff -u -r1.106 NEWS
> --- binutils/NEWS 2 Nov 2011 03:09:01 -0000 1.106
> +++ binutils/NEWS 15 Feb 2012 10:34:02 -0000
> @@ -1,5 +1,7 @@
> -*- text -*-
>
> +* Add support for x64 Windows target of the delayed-load-library.
> +
> * Add support for the Renesas RL78 architecture.
>
> Changes in 2.22:
> Index: binutils/dlltool.c
> ===================================================================
> RCS file: /cvs/src/src/binutils/dlltool.c,v
> retrieving revision 1.104
> diff -u -r1.104 dlltool.c
> --- binutils/dlltool.c 9 Feb 2012 04:51:44 -0000 1.104
> +++ binutils/dlltool.c 15 Feb 2012 10:34:03 -0000
> @@ -515,6 +515,14 @@
> 0xE9, 0x00, 0x00, 0x00, 0x00 /* jmp __tailMerge__dllname */
> };
>
> +static const unsigned char i386_x64_dljtab[] =
> +{
> + 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, /* jmp __imp__function */
> + 0x48, 0x8d, 0x05, /* leaq rax, (__imp__function) */
> + 0x00, 0x00, 0x00, 0x00,
> + 0xE9, 0x00, 0x00, 0x00, 0x00 /* jmp __tailMerge__dllname */
> +};
> +
> static const unsigned char arm_jtab[] =
> {
> 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
> @@ -591,6 +599,22 @@
> "\tpopl %%ecx\n"
> "\tjmp *%%eax\n";
>
> +static const char i386_x64_trampoline[] =
> + "\tpushq %%rcx\n"
> + "\tpushq %%rdx\n"
> + "\tpushq %%r8\n"
> + "\tpushq %%r9\n"
> + "\tsubq $40, %%rsp\n"
> + "\tmovq %%rax, %%rdx\n"
> + "\tleaq __DELAY_IMPORT_DESCRIPTOR_%s(%%rip), %%rcx\n"
> + "\tcall __delayLoadHelper2\n"
> + "\taddq $40, %%rsp\n"
> + "\tpopq %%r9\n"
> + "\tpopq %%r8\n"
> + "\tpopq %%rdx\n"
> + "\tpopq %%rcx\n"
> + "\tjmp *%%rax\n";
> +
> struct mac
> {
> const char *type;
> @@ -735,7 +759,7 @@
> "jmp *", ".global", ".space", ".align\t2",".align\t4", "",
> "pe-x86-64",bfd_arch_i386,
> i386_jtab, sizeof (i386_jtab), 2,
> - i386_dljtab, sizeof (i386_dljtab), 2, 7, 12, i386_trampoline
> + i386_x64_dljtab, sizeof (i386_x64_dljtab), 2, 9, 14, i386_x64_trampoline
> }
> ,
> { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
> @@ -2609,9 +2633,14 @@
>
> if (delay)
> {
> - rel2->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
> + if (machine == MX86)
> + rel2->howto = bfd_reloc_type_lookup (abfd,
> + BFD_RELOC_32_PCREL);
> + else
> + rel2->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
> rel2->sym_ptr_ptr = rel->sym_ptr_ptr;
> - rel3->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32_PCREL);
> + rel3->howto = bfd_reloc_type_lookup (abfd,
> + BFD_RELOC_32_PCREL);
> rel3->sym_ptr_ptr = iname_lab_pp;
> }
>
> @@ -2623,10 +2652,11 @@
> case IDATA5:
> if (delay)
> {
> - si->data = xmalloc (4);
> - si->size = 4;
> + si->size = create_for_pep ? 8 : 4;
> + si->data = xmalloc (si->size);
> sec->reloc_count = 1;
> memset (si->data, 0, si->size);
> + /* Point after jmp [__imp_...] instruction. */
> si->data[0] = 6;
> rel = xmalloc (sizeof (arelent));
> rpp = xmalloc (sizeof (arelent *) * 2);
> @@ -2634,7 +2664,10 @@
> rpp[1] = 0;
> rel->address = 0;
> rel->addend = 0;
> - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
> + if (create_for_pep)
> + rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_64);
> + else
> + rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
> rel->sym_ptr_ptr = secdata[TEXT].sympp;
> sec->orelocation = rpp;
> break;
> @@ -3005,6 +3038,8 @@
> fprintf (f, "\n.section .data\n");
> fprintf (f, "__DLL_HANDLE_%s:\n", imp_name_lab);
> fprintf (f, "\t%s\t0\t%s Handle\n", ASM_LONG, ASM_C);
> + if (create_for_pep)
> + fprintf (f, "\t%s\t0\n", ASM_LONG);
> fprintf (f, "\n");
>
> fprintf (f, "%sStuff for compatibility\n", ASM_C);
> @@ -3013,11 +3048,10 @@
> {
> fprintf (f, "\t.section\t.idata$5\n");
> /* NULL terminating list. */
> -#ifdef DLLTOOL_MX86_64
> - fprintf (f,"\t%s\t0\n\t%s\t0\n", ASM_LONG, ASM_LONG);
> -#else
> - fprintf (f,"\t%s\t0\n", ASM_LONG);
> -#endif
> + if (create_for_pep)
> + fprintf (f,"\t%s\t0\n\t%s\t0\n", ASM_LONG, ASM_LONG);
> + else
> + fprintf (f,"\t%s\t0\n", ASM_LONG);
> fprintf (f, "__IAT_%s:\n", imp_name_lab);
> }
>
> @@ -3025,6 +3059,8 @@
> {
> fprintf (f, "\t.section\t.idata$4\n");
> fprintf (f, "\t%s\t0\n", ASM_LONG);
> + if (create_for_pep)
> + fprintf (f, "\t%s\t0\n", ASM_LONG);
> fprintf (f, "\t.section\t.idata$4\n");
> fprintf (f, "__INT_%s:\n", imp_name_lab);
> }
Ping ...
--
Best Regards,
xunxun
More information about the Binutils
mailing list