Limit dyld image suffixes guessed by guessLibraryShortName()
Summary: guessLibraryShortName() separates a full Mach-O dylib install name path into a short name and a dyld image suffix. The short name is the name of the dylib without its path or extension. The dyld image suffix is a string used by dyld to load variants of dylibs if available at runtime; for example, "when binding this process, load 'debug' variants of all required dylibs." dyld knows exactly what the image suffix is, but by convention diagnostic tools such as llvm-nm attempt to guess suffix names by looking at the install name path. These dyld image suffixes are separated from the short name by a '_' character. Because the '_' character is commonly used to separate words in filenames guessLibraryShortName() cannot reliably separate a dylib's short name from an arbitrary image suffix; imagine if both the short name and the suffix contains an '_' character! To better deal with this ambiguity, guessLibraryShortName() will recognize only "_debug" and "_profile" as valid Suffix values. Calling code needs to be tolerant of guessLibraryShortName() guessing incorrectly. The previous implementation of guessLibraryShortName() did not allow '_' characters to appear in short names. When present, the short name would be truncated, e.g., "libcompiler_rt" => "libcompiler". This change allows "libcompiler_rt" and "libcompiler_rt_debug" to both be recognized as "libcompiler_rt". rdar://47412244 Reviewers: kledzik, lhames, pete Reviewed By: pete Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D56978 llvm-svn: 352104
This commit is contained in:
parent
7fca260dc8
commit
f4c902bd77
|
@ -2241,9 +2241,18 @@ uint8_t MachOObjectFile::getRelocationLength(DataRefImpl Rel) const {
|
|||
// one of the two following forms:
|
||||
// libFoo.A.dylib
|
||||
// libFoo.dylib
|
||||
//
|
||||
// The library may have a suffix trailing the name Foo of the form:
|
||||
// libFoo_profile.A.dylib
|
||||
// libFoo_profile.dylib
|
||||
// These dyld image suffixes are separated from the short name by a '_'
|
||||
// character. Because the '_' character is commonly used to separate words in
|
||||
// filenames guessLibraryShortName() cannot reliably separate a dylib's short
|
||||
// name from an arbitrary image suffix; imagine if both the short name and the
|
||||
// suffix contains an '_' character! To better deal with this ambiguity,
|
||||
// guessLibraryShortName() will recognize only "_debug" and "_profile" as valid
|
||||
// Suffix values. Calling code needs to be tolerant of guessLibraryShortName()
|
||||
// guessing incorrectly.
|
||||
//
|
||||
// The Name of the dynamic library is also recognized as a library name if it
|
||||
// has the following form:
|
||||
|
@ -2251,7 +2260,6 @@ uint8_t MachOObjectFile::getRelocationLength(DataRefImpl Rel) const {
|
|||
//
|
||||
// If the Name of the dynamic library is none of the forms above then a NULL
|
||||
// StringRef is returned.
|
||||
//
|
||||
StringRef MachOObjectFile::guessLibraryShortName(StringRef Name,
|
||||
bool &isFramework,
|
||||
StringRef &Suffix) {
|
||||
|
@ -2271,7 +2279,10 @@ StringRef MachOObjectFile::guessLibraryShortName(StringRef Name,
|
|||
Idx = Foo.rfind('_');
|
||||
if (Idx != Foo.npos && Foo.size() >= 2) {
|
||||
Suffix = Foo.slice(Idx, Foo.npos);
|
||||
Foo = Foo.slice(0, Idx);
|
||||
if (Suffix != "_debug" && Suffix != "_profile")
|
||||
Suffix = StringRef();
|
||||
else
|
||||
Foo = Foo.slice(0, Idx);
|
||||
}
|
||||
|
||||
// First look for the form Foo.framework/Foo
|
||||
|
@ -2332,10 +2343,14 @@ guess_library:
|
|||
else
|
||||
b = b+1;
|
||||
// ignore any suffix after an underbar like Foo_profile.A.dylib
|
||||
Idx = Name.find('_', b);
|
||||
Idx = Name.rfind('_');
|
||||
if (Idx != Name.npos && Idx != b) {
|
||||
Lib = Name.slice(b, Idx);
|
||||
Suffix = Name.slice(Idx, a);
|
||||
if (Suffix != "_debug" && Suffix != "_profile") {
|
||||
Suffix = StringRef();
|
||||
Lib = Name.slice(b, a);
|
||||
}
|
||||
}
|
||||
else
|
||||
Lib = Name.slice(b, a);
|
||||
|
|
Binary file not shown.
|
@ -32,6 +32,8 @@ test2: (indirect) external _i (for __i)
|
|||
# /usr/lib/libPathATS.A_profile.dylib
|
||||
# QT.A.qtx
|
||||
# /lib/QTPath.qtx
|
||||
# /usr/lib/libfoo_bar.dylib
|
||||
# /usr/lib/libfoo_bar_profile.dylib
|
||||
# /usr/lib/libSystem.B.dylib
|
||||
# to test that MachOObjectFile::guessLibraryShortName() is correctly parsing
|
||||
# them into their short names.
|
||||
|
@ -44,7 +46,9 @@ test3: (undefined) external _fooPathSuffix (from FooPathSuffix)
|
|||
test3: (undefined) external _fooPathVers (from FooPathVers)
|
||||
test3: (undefined) external _fooSuffix (from FooSuffix)
|
||||
test3: (undefined) external _fooVers (from FooVers)
|
||||
test3: 0000000100000e60 (__TEXT,__text) external _main
|
||||
test3: (undefined) external _foo_bar (from libfoo_bar)
|
||||
test3: (undefined) external _foo_barSuffix (from libfoo_barSuffix)
|
||||
test3: 0000000100000e50 (__TEXT,__text) external _main
|
||||
test3: (undefined) external _qt (from QT)
|
||||
test3: (undefined) external _qtPath (from QTPath)
|
||||
test3: (undefined) external _x (from libx)
|
||||
|
|
Loading…
Reference in New Issue