[lld] r197307 - [PECOFF] Export undecorated symbols from DLL.
Rui Ueyama
ruiu at google.com
Fri Dec 13 20:32:30 PST 2013
Author: ruiu
Date: Fri Dec 13 22:32:29 2013
New Revision: 197307
URL: http://llvm.org/viewvc/llvm-project?rev=197307&view=rev
Log:
[PECOFF] Export undecorated symbols from DLL.
Symbol names exported from a DLL should be undecorated, not prefixed by
an underscore ones.
Modified:
lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp
lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h
lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
lld/trunk/test/pecoff/export.test
Modified: lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h Fri Dec 13 22:32:29 2013
@@ -99,16 +99,8 @@ public:
StringRef searchLibraryFile(StringRef path) const;
- /// Returns the decorated name of the given symbol name. On 32-bit x86, it
- /// adds "_" at the beginning of the string. On other architectures, the
- /// return value is the same as the argument.
- StringRef decorateSymbol(StringRef name) const {
- if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)
- return name;
- std::string str = "_";
- str.append(name);
- return allocate(str);
- }
+ StringRef decorateSymbol(StringRef name) const;
+ StringRef undecorateSymbol(StringRef name) const;
void setEntrySymbolName(StringRef name) {
if (!name.empty())
Modified: lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp Fri Dec 13 22:32:29 2013
@@ -62,15 +62,16 @@ EdataPass::createAddressTable(const std:
}
edata::EdataAtom *
-EdataPass::createNamePointerTable(const std::vector<const DefinedAtom *> &atoms,
+EdataPass::createNamePointerTable(const PECOFFLinkingContext &ctx,
+ const std::vector<const DefinedAtom *> &atoms,
MutableFile *file) {
EdataAtom *table =
new (_alloc) EdataAtom(_file, sizeof(uint32_t) * atoms.size());
size_t offset = 0;
for (const DefinedAtom *atom : atoms) {
- COFFStringAtom *stringAtom = new (_alloc)
- COFFStringAtom(_file, _stringOrdinal++, ".edata", atom->name());
+ auto *stringAtom = new (_alloc) COFFStringAtom(
+ _file, _stringOrdinal++, ".edata", ctx.undecorateSymbol(atom->name()));
file->addAtom(*stringAtom);
addDir32NBReloc(table, stringAtom, offset);
offset += sizeof(uint32_t);
@@ -121,7 +122,7 @@ void EdataPass::perform(std::unique_ptr<
addDir32NBReloc(table, addressTable, offsetof(export_directory_table_entry,
ExportAddressTableRVA));
- EdataAtom *namePointerTable = createNamePointerTable(atoms, file.get());
+ EdataAtom *namePointerTable = createNamePointerTable(_ctx, atoms, file.get());
file->addAtom(*namePointerTable);
addDir32NBReloc(table, namePointerTable,
offsetof(export_directory_table_entry, NamePointerRVA));
Modified: lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h Fri Dec 13 22:32:29 2013
@@ -66,7 +66,8 @@ private:
edata::EdataAtom *
createAddressTable(const std::vector<const DefinedAtom *> &atoms);
edata::EdataAtom *
- createNamePointerTable(const std::vector<const DefinedAtom *> &atoms,
+ createNamePointerTable(const PECOFFLinkingContext &ctx,
+ const std::vector<const DefinedAtom *> &atoms,
MutableFile *file);
edata::EdataAtom *
createOrdinalTable(const std::vector<const DefinedAtom *> &atoms);
Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Fri Dec 13 22:32:29 2013
@@ -183,6 +183,24 @@ StringRef PECOFFLinkingContext::searchLi
return filename;
}
+/// Returns the decorated name of the given symbol name. On 32-bit x86, it
+/// adds "_" at the beginning of the string. On other architectures, the
+/// return value is the same as the argument.
+StringRef PECOFFLinkingContext::decorateSymbol(StringRef name) const {
+ if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)
+ return name;
+ std::string str = "_";
+ str.append(name);
+ return allocate(str);
+}
+
+StringRef PECOFFLinkingContext::undecorateSymbol(StringRef name) const {
+ if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)
+ return name;
+ assert(name.startswith("_"));
+ return name.substr(1);
+}
+
Writer &PECOFFLinkingContext::writer() const { return *_writer; }
ErrorOr<Reference::Kind>
Modified: lld/trunk/test/pecoff/export.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/export.test?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/test/pecoff/export.test (original)
+++ lld/trunk/test/pecoff/export.test Fri Dec 13 22:32:29 2013
@@ -8,7 +8,7 @@ CHECK: Contents of section .edata:
CHECK-NEXT: 1000 00000000 {{........}} 00000000 3c100000
CHECK-NEXT: 1010 01000000 02000000 02000000 28100000
CHECK-NEXT: 1020 30100000 38100000 08200000 10200000
-CHECK-NEXT: 1030 50100000 5b100000 00000100 6578706f
+CHECK-NEXT: 1030 50100000 5a100000 00000100 6578706f
CHECK-NEXT: 1040 72742e74 6573742e 746d702e 646c6c00
-CHECK-NEXT: 1050 5f657870 6f727466 6e31005f 6578706f
-CHECK-NEXT: 1060 7274666e 3200
+CHECK-NEXT: 1050 6578706f 7274666e 31006578 706f7274
+CHECK-NEXT: 1060 666e3200
More information about the llvm-commits
mailing list