[lld] r185307 - [PECOFF][Writer] Amend the comment about DLL linking.
Rui Ueyama
ruiu at google.com
Mon Jul 1 00:25:30 PDT 2013
Author: ruiu
Date: Mon Jul 1 02:25:30 2013
New Revision: 185307
URL: http://llvm.org/viewvc/llvm-project?rev=185307&view=rev
Log:
[PECOFF][Writer] Amend the comment about DLL linking.
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp?rev=185307&r1=185306&r2=185307&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp Mon Jul 1 02:25:30 2013
@@ -17,7 +17,7 @@
/// purposes.
///
/// - For static linking: An archive file in this use case contains multiple
-/// normal .obj files and is used for static linking. This is the same
+/// regular .obj files and is used for static linking. This is the same
/// usage as .a file in Unix.
///
/// - For dynamic linking: An archive file in this use case contains pseudo
@@ -36,32 +36,31 @@
/// contains a list of DLL names and list of symbols that need to be resolved by
/// the loader. Windows loader maps the executable and all the DLLs to memory,
/// resolves the symbols referencing items in DLLs, and updates the import
-/// address table in memory. The import address table is an array of pointers to
-/// all of the data or functions in DLL referenced by the executable. You cannot
-/// access items in DLLs directly. They have to be accessed through an extra
-/// level of indirection.
+/// address table (IAT) in memory. The IAT is an array of pointers to all of the
+/// data or functions in DLL referenced by the executable. You cannot access
+/// items in DLLs directly. They have to be accessed through an extra level of
+/// indirection.
///
/// So, if you want to access an item in DLL, you have to go through a
-/// pointer. How do you actually do that? For each symbol in DLL, there is
-/// another set of symbols with "_imp__" prefix. For example, if you have a
-/// global variable "foo" in a DLL, a pointer to the variable is exported from
-/// the DLL as "_imp__foo". You cannot directly use "foo" but need to go through
-/// "_imp__foo", because symbol "foo" is not exported.
+/// pointer. How do you actually do that? You need a symbol for a pointer in the
+/// IAT. For each symbol defined in a DLL, a symbol with "__imp_" prefix is
+/// exported from the DLL for an IAT entry. For example, if you have a global
+/// variable "foo" in a DLL, a pointer to the variable is available as
+/// "_imp__foo". The IAT is an array of _imp__ symbols.
///
/// Is this OK? That's not that complicated. Because items in a DLL are not
/// directly accessible, you need to access through a pointer, and the pointer
-/// is available as a symbol with "_imp__" prefix.
+/// is available as a symbol with _imp__ prefix.
///
-/// Trick 1: Although you can write code with "_imp__" prefix, today's compiler
-/// and linker let you write code as if there's no extra level of
-/// indirection. That's why you haven't seen lots of _imp__ in your code. A
-/// variable or a function declared with "dllimport" attributes is treated as an
-/// item in a DLL, and the compiler automatically mangles its name and inserts
-/// the extra level of indirection when accessing the item. Here are some
-/// examples:
+/// Note 1: Although you can write code with _imp__ prefix, today's compiler and
+/// linker let you write code as if there's no extra level of indirection.
+/// That's why you haven't seen lots of _imp__ in your code. A variable or a
+/// function declared with "dllimport" attribute is treated as an item in a DLL,
+/// and the compiler automatically mangles its name and inserts the extra level
+/// of indirection when accessing the item. Here are some examples:
///
/// __declspec(dllimport) int var_in_dll;
-/// var_in_dll = 3; // is equivalent to *_imp__var_in_dll = 3;
+/// var_in_dll = 3; // is equivalent to *_imp__var_in_dll = 3;
///
/// __declspec(dllimport) int fn_in_dll(void);
/// fn_in_dll(); // is equivalent to (*_imp__fn_in_dll)();
@@ -69,9 +68,9 @@
/// It's just the compiler rewrites code for you so that you don't need to
/// handle the indirection youself.
///
-/// Trick 2: __declspec(dllimport) is mandatory for data but optional for
+/// Note 2: __declspec(dllimport) is mandatory for data but optional for
/// function. For a function, the linker creates a jump table with the original
-/// symbol name, so that the function is accessible without "_imp__" prefix. The
+/// symbol name, so that the function is accessible without _imp__ prefix. The
/// same function in a DLL can be called through two different symbols if it's
/// not dllimport'ed.
///
@@ -81,22 +80,22 @@
/// The above functions do the same thing. fn's content is a JMP instruction to
/// branch to the address pointed by _imp__fn. The latter may be a little bit
/// slower than the former because it will execute the extra JMP instruction, but
-/// that's not an important point here.
+/// that's usually negligible.
///
/// If a function is dllimport'ed, which is usually done in a header file,
/// mangled name will be used at compile time so the jump table will not be
/// used.
///
/// Because there's no way to hide the indirection for data access at link time,
-/// data has to be accessed through dllimport'ed symbols or explicit "_imp__"
+/// data has to be accessed through dllimport'ed symbols or explicit _imp__
/// prefix.
///
/// Creating Atoms for the Import Address Table
/// ===========================================
///
-/// This file is to read a pseudo object file and create at most two atoms. One
-/// is a shared library atom for "_imp__" symbol. The another is a defined atom
-/// for the JMP instruction if the symbol is for a function.
+/// The function in this file reads a pseudo object file and creates at most two
+/// atoms. One is a shared library atom for _imp__ symbol. The another is a
+/// defined atom for the JMP instruction if the symbol is for a function.
///
//===----------------------------------------------------------------------===//
More information about the llvm-commits
mailing list