diff options
author | Rui Ueyama <ruiu@google.com> | 2013-06-03 00:27:03 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2013-06-03 00:27:03 +0000 |
commit | 891c0cd3c1c1f408d2478ef9c35fe152d2ba5c04 (patch) | |
tree | e960bd2817547e08ad6918c59bea71a04f613e36 | |
parent | 85cc972a06690507a2660fccb198319b0402105f (diff) | |
download | external_llvm-891c0cd3c1c1f408d2478ef9c35fe152d2ba5c04.zip external_llvm-891c0cd3c1c1f408d2478ef9c35fe152d2ba5c04.tar.gz external_llvm-891c0cd3c1c1f408d2478ef9c35fe152d2ba5c04.tar.bz2 |
[Object/COFF] Fix Windows .lib name handling.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183091 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Object/Archive.cpp | 14 | ||||
-rw-r--r--[-rwxr-xr-x] | test/Object/Inputs/coff_archive.lib | bin | 41196 -> 41196 bytes | |||
-rw-r--r-- | test/Object/Inputs/coff_archive_short.lib | bin | 0 -> 1336 bytes | |||
-rw-r--r-- | test/Object/coff-archive-short.test | 26 |
4 files changed, 36 insertions, 4 deletions
diff --git a/lib/Object/Archive.cpp b/lib/Object/Archive.cpp index 0e13d05..be35924 100644 --- a/lib/Object/Archive.cpp +++ b/lib/Object/Archive.cpp @@ -132,8 +132,11 @@ Archive::Archive(MemoryBuffer *source, error_code &ec) // COFF archive format // First member : / // Second member : / (provides a directory of symbols) - // Third member : // contains the string table, this is present even if the - // string table is empty + // Third member : // (may exist, if it exists, contains the string table) + // Note: Microsoft PE/COFF Spec 8.3 says that the third member is present + // even if the string table is empty. However, lib.exe does not in fact + // seem to create the third member if there's no member whose filename + // exceeds 15 characters. So the third member is optional. if (name == "/") { SymbolTable = i; StringTable = e; @@ -150,14 +153,17 @@ Archive::Archive(MemoryBuffer *source, error_code &ec) Format = K_GNU; StringTable = i; ++i; - } else { + } else { Format = K_COFF; if (i != e) { SymbolTable = i; ++i; } if (i != e) { - StringTable = i; + if ((ec = i->getName(name))) + return; + if (name == "//") + StringTable = i; } } } else if (name == "__.SYMDEF") { diff --git a/test/Object/Inputs/coff_archive.lib b/test/Object/Inputs/coff_archive.lib Binary files differindex e079991..e079991 100755..100644 --- a/test/Object/Inputs/coff_archive.lib +++ b/test/Object/Inputs/coff_archive.lib diff --git a/test/Object/Inputs/coff_archive_short.lib b/test/Object/Inputs/coff_archive_short.lib Binary files differnew file mode 100644 index 0000000..41cb1c2 --- /dev/null +++ b/test/Object/Inputs/coff_archive_short.lib diff --git a/test/Object/coff-archive-short.test b/test/Object/coff-archive-short.test new file mode 100644 index 0000000..fa531b3 --- /dev/null +++ b/test/Object/coff-archive-short.test @@ -0,0 +1,26 @@ +# +# Check if the index is appearing properly in the output file +# +# coff_archive_short.lib does not have member whose name is longer +# than 15 characters, thus, unlike coff_archive.lib, it has no string +# table as the third member. +# +RUN: llvm-nm --numeric-sort -s %p/Inputs/coff_archive_short.lib | FileCheck -check-prefix=CHECKIDX %s + +CHECKIDX: Archive map +CHECKIDX: _shortfn1 in short1.obj +CHECKIDX: _shortfn2 in short2.obj +CHECKIDX: short1.obj: +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 i .drectve +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 T _shortfn1 +CHECKIDX: 00000001 a @feat.00 +CHECKIDX: 00aa9d1b a @comp.id +CHECKIDX: short2.obj: +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 i .drectve +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 T _shortfn2 +CHECKIDX: 00000001 a @feat.00 +CHECKIDX: 00aa9d1b a @comp.id |