Skip to content

Commit

Permalink
[dsymutil] Ignore absolute symbols in the debug map
Browse files Browse the repository at this point in the history
Quoting from the comment added to the code:

    // Objective-C on i386 uses artificial absolute symbols to
    // perform some link time checks. Those symbols have a fixed 0
    // address that might conflict with real symbols in the object
    // file. As I cannot see a way for absolute symbols to find
    // their way into the debug information, let's just ignore those.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255350 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
fredriss committed Dec 11, 2015
1 parent 47be361 commit ba16151
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 3 deletions.
Binary file not shown.
Binary file not shown.
16 changes: 16 additions & 0 deletions test/tools/dsymutil/absolute_symbol.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
RUN: llvm-dsymutil -dump-debug-map -oso-prepend-path %p %p/Inputs/absolute_sym.macho.i386 | FileCheck %s

The tested object file has been created by the dummy Objective-C code:
@interface Foo
@end

@implementation Foo
@end

int main() { return 0; }

compiled for i386. This create an absolute symbol .objc_class_name_Foo
We must not consider this symbol for debug info linking as its address
might conflict with other real symbols in the same file.

CHECK-NOT: objc_class_name_Foo
17 changes: 14 additions & 3 deletions tools/dsymutil/MachODebugMapParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "BinaryHolder.h"
#include "DebugMap.h"
#include "dsymutil.h"
#include "llvm/ADT/Optional.h"
#include "llvm/Object/MachO.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
Expand Down Expand Up @@ -53,7 +54,7 @@ class MachODebugMapParser {
/// Owns the MemoryBuffer for the currently handled object file.
BinaryHolder CurrentObjectHolder;
/// Map of the currently processed object file symbol addresses.
StringMap<uint64_t> CurrentObjectAddresses;
StringMap<Optional<uint64_t>> CurrentObjectAddresses;
/// Element of the debug map corresponfing to the current object file.
DebugMapObject *CurrentDebugMapObject;

Expand Down Expand Up @@ -388,7 +389,9 @@ void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t StringIndex,
if (ObjectSymIt == CurrentObjectAddresses.end())
return Warning("could not find object file symbol for symbol " +
Twine(Name));
if (!CurrentDebugMapObject->addSymbol(Name, ObjectSymIt->getValue(), Value,
if (!ObjectSymIt->getValue())
return;
if (!CurrentDebugMapObject->addSymbol(Name, *ObjectSymIt->getValue(), Value,
Size))
return Warning(Twine("failed to insert symbol '") + Name +
"' in the debug map.");
Expand All @@ -404,7 +407,15 @@ void MachODebugMapParser::loadCurrentObjectFileSymbols(
ErrorOr<StringRef> Name = Sym.getName();
if (!Name)
continue;
CurrentObjectAddresses[*Name] = Addr;
// Objective-C on i386 uses artificial absolute symbols to
// perform some link time checks. Those symbols have a fixed 0
// address that might conflict with real symbols in the object
// file. As I cannot see a way for absolute symbols to find
// their way into the debug information, let's just ignore those.
if (Sym.getFlags() & SymbolRef::SF_Absolute)
CurrentObjectAddresses[*Name] = None;
else
CurrentObjectAddresses[*Name] = Addr;
}
}

Expand Down

0 comments on commit ba16151

Please sign in to comment.