[lld] r303374 - Merge IAT and ILT.

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Mon May 22 21:56:51 PDT 2017


On Thu, May 18, 2017 at 12:59 PM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: ruiu
> Date: Thu May 18 14:59:22 2017
> New Revision: 303374
>
> URL: http://llvm.org/viewvc/llvm-project?rev=303374&view=rev
> Log:
> Merge IAT and ILT.
>
> Previously, LLD-produced executables had IAT (Import Address Table) and
> ILT (Import Lookup Table) as separate chunks of data, although their
> contents are identical. My interpretation of the COFF spec when I wrote
> the COFF linker is that they need to be separate tables even though they
> are the same.
>
> But Peter found that the Windows loader is fine with executables in
> which IAT and ILT are merged. This is a patch to merge IAT and ILT.
> I confirmed that an lld-link self-hosted with this patch works fine.
>

Yes, the loader supports having a single IAT/ILT area.  However, the
PE/COFF specification does recommend that the IAT/ILT remain separate in
modern binaries.  The IAT is always patched, the ILT is preserved as is.
This also is divergent from link.exe (note that older versions of the
Borland and Symantec toolchains *did* merge the IAT/ILT so the loader does
actually support that type of binary, but that behaviour has changed since).



> Fixes https://bugs.llvm.org/show_bug.cgi?id=33064
>
> Differential Revision: https://reviews.llvm.org/D33326
>
> Modified:
>     lld/trunk/COFF/DLL.cpp
>     lld/trunk/COFF/DLL.h
>     lld/trunk/test/COFF/armnt-imports.test
>     lld/trunk/test/COFF/hello32.test
>     lld/trunk/test/COFF/imports.test
>
> Modified: lld/trunk/COFF/DLL.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DLL.
> cpp?rev=303374&r1=303373&r2=303374&view=diff
> ============================================================
> ==================
> --- lld/trunk/COFF/DLL.cpp (original)
> +++ lld/trunk/COFF/DLL.cpp Thu May 18 14:59:22 2017
> @@ -100,13 +100,17 @@ public:
>
>    void writeTo(uint8_t *Buf) const override {
>      auto *E = (coff_import_directory_table_entry *)(Buf +
> OutputSectionOff);
> -    E->ImportLookupTableRVA = LookupTab->getRVA();
>      E->NameRVA = DLLName->getRVA();
> +
> +    // The import descriptor table contains two pointers to
> +    // the tables describing dllimported symbols. But the
> +    // Windows loader actually uses only one. So we create
> +    // only one table and set both fields to its address.
> +    E->ImportLookupTableRVA = AddressTab->getRVA();
>      E->ImportAddressTableRVA = AddressTab->getRVA();
>    }
>
>    Chunk *DLLName;
> -  Chunk *LookupTab;
>    Chunk *AddressTab;
>  };
>
> @@ -388,7 +392,6 @@ std::vector<Chunk *> IdataContents::getC
>    // Add each type in the correct order.
>    std::vector<Chunk *> V;
>    V.insert(V.end(), Dirs.begin(), Dirs.end());
> -  V.insert(V.end(), Lookups.begin(), Lookups.end());
>    V.insert(V.end(), Addresses.begin(), Addresses.end());
>    V.insert(V.end(), Hints.begin(), Hints.end());
>    V.insert(V.end(), DLLNames.begin(), DLLNames.end());
> @@ -404,21 +407,18 @@ void IdataContents::create() {
>      // we need to create HintName chunks to store the names.
>      // If they don't (if they are import-by-ordinals), we store only
>      // ordinal values to the table.
> -    size_t Base = Lookups.size();
> +    size_t Base = Addresses.size();
>      for (DefinedImportData *S : Syms) {
>        uint16_t Ord = S->getOrdinal();
>        if (S->getExternalName().empty()) {
> -        Lookups.push_back(make<OrdinalOnlyChunk>(Ord));
>          Addresses.push_back(make<OrdinalOnlyChunk>(Ord));
>          continue;
>        }
>        auto *C = make<HintNameChunk>(S->getExternalName(), Ord);
> -      Lookups.push_back(make<LookupChunk>(C));
>        Addresses.push_back(make<LookupChunk>(C));
>        Hints.push_back(C);
>      }
>      // Terminate with null values.
> -    Lookups.push_back(make<NullChunk>(ptrSize()));
>      Addresses.push_back(make<NullChunk>(ptrSize()));
>
>      for (int I = 0, E = Syms.size(); I < E; ++I)
> @@ -427,7 +427,6 @@ void IdataContents::create() {
>      // Create the import table header.
>      DLLNames.push_back(make<StringChunk>(Syms[0]->getDLLName()));
>      auto *Dir = make<ImportDirectoryChunk>(DLLNames.back());
> -    Dir->LookupTab = Lookups[Base];
>      Dir->AddressTab = Addresses[Base];
>      Dirs.push_back(Dir);
>    }
>
> Modified: lld/trunk/COFF/DLL.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DLL.h?
> rev=303374&r1=303373&r2=303374&view=diff
> ============================================================
> ==================
> --- lld/trunk/COFF/DLL.h (original)
> +++ lld/trunk/COFF/DLL.h Thu May 18 14:59:22 2017
> @@ -36,7 +36,6 @@ private:
>
>    std::vector<DefinedImportData *> Imports;
>    std::vector<Chunk *> Dirs;
> -  std::vector<Chunk *> Lookups;
>    std::vector<Chunk *> Addresses;
>    std::vector<Chunk *> Hints;
>    std::vector<Chunk *> DLLNames;
>
> Modified: lld/trunk/test/COFF/armnt-imports.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/
> armnt-imports.test?rev=303374&r1=303373&r2=303374&view=diff
> ============================================================
> ==================
> --- lld/trunk/test/COFF/armnt-imports.test (original)
> +++ lld/trunk/test/COFF/armnt-imports.test Thu May 18 14:59:22 2017
> @@ -6,7 +6,7 @@
>  # CHECK: Import {
>  # CHECK:   Name: library.dll
>  # CHECK:   ImportLookupTableRVA: 0x2028
> -# CHECK:   ImportAddressTableRVA: 0x2030
> +# CHECK:   ImportAddressTableRVA: 0x2028
>  # CHECK:   Symbol: function (0)
>  # CHECK: }
>
>
> Modified: lld/trunk/test/COFF/hello32.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/
> hello32.test?rev=303374&r1=303373&r2=303374&view=diff
> ============================================================
> ==================
> --- lld/trunk/test/COFF/hello32.test (original)
> +++ lld/trunk/test/COFF/hello32.test Thu May 18 14:59:22 2017
> @@ -77,7 +77,7 @@ HEADER-NEXT:     LoadConfigTableRVA: 0x0
>  HEADER-NEXT:     LoadConfigTableSize: 0x0
>  HEADER-NEXT:     BoundImportRVA: 0x0
>  HEADER-NEXT:     BoundImportSize: 0x0
> -HEADER-NEXT:     IATRVA: 0x3034
> +HEADER-NEXT:     IATRVA: 0x3028
>  HEADER-NEXT:     IATSize: 0xC
>  HEADER-NEXT:     DelayImportDescriptorRVA: 0x0
>  HEADER-NEXT:     DelayImportDescriptorSize: 0x0
> @@ -113,7 +113,7 @@ IMPORTS: AddressSize: 32bit
>  IMPORTS: Import {
>  IMPORTS:   Name: std32.dll
>  IMPORTS:   ImportLookupTableRVA: 0x3028
> -IMPORTS:   ImportAddressTableRVA: 0x3034
> +IMPORTS:   ImportAddressTableRVA: 0x3028
>  IMPORTS:   Symbol: ExitProcess (0)
>  IMPORTS:   Symbol: MessageBoxA (1)
>  IMPORTS: }
>
> Modified: lld/trunk/test/COFF/imports.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/
> imports.test?rev=303374&r1=303373&r2=303374&view=diff
> ============================================================
> ==================
> --- lld/trunk/test/COFF/imports.test (original)
> +++ lld/trunk/test/COFF/imports.test Thu May 18 14:59:22 2017
> @@ -21,14 +21,14 @@ TEXT-NEXT: callq   60
>  TEXT-NEXT: movl    $0, %ecx
>  TEXT-NEXT: callq   18
>  TEXT-NEXT: callq   29
> -TEXT:      jmpq    *4098(%rip)
> -TEXT:      jmpq    *4090(%rip)
> -TEXT:      jmpq    *4082(%rip)
> +TEXT:      jmpq    *4066(%rip)
> +TEXT:      jmpq    *4058(%rip)
> +TEXT:      jmpq    *4050(%rip)
>
>  IMPORT:      Import {
>  IMPORT-NEXT:   Name: std64.dll
>  IMPORT-NEXT:   ImportLookupTableRVA: 0x3028
> -IMPORT-NEXT:   ImportAddressTableRVA: 0x3048
> +IMPORT-NEXT:   ImportAddressTableRVA: 0x3028
>  IMPORT-NEXT:   Symbol: ExitProcess (0)
>  IMPORT-NEXT:   Symbol:  (50)
>  IMPORT-NEXT:   Symbol: MessageBoxA (1)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170522/823c989b/attachment.html>


More information about the llvm-commits mailing list