Resolve binary symlinks before finding its separate .debug file

I have found LLDB cannot find separate debug info of Fedora /usr/bin/gdb.
It is because:

lrwxrwxrwx 1 root root       14 Jan 25 20:41 /usr/bin/gdb -> ../libexec/gdb*
-rwxr-xr-x 1 root root 10180296 Jan 25 20:41 /usr/libexec/gdb*
ls: cannot access '/usr/lib/debug/usr/bin/gdb-8.0.1-35.fc27.x86_64.debug': No such file or directory
-r--r--r-- 1 root root 29200464 Jan 25 20:41 /usr/lib/debug/usr/libexec/gdb-8.0.1-35.fc27.x86_64.debug

FYI that -8.0.1-35.fc27.x86_64.debug may look confusing, it was always just
.debug before.
Why is /usr/bin/gdb a symlink is offtopic for this bugreport, Fedora has it so
for some reasons.

It is always safest to look at the .debug file only after resolving all
symlinks on the binary file.

Differential revision: https://reviews.llvm.org/D42853

llvm-svn: 324224
This commit is contained in:
Jan Kratochvil
2018-02-05 10:50:38 +00:00
parent 10392cdbf7
commit 401df58064
4 changed files with 52 additions and 2 deletions

View File

@@ -0,0 +1,20 @@
LEVEL = ../../make
C_SOURCES := main.c
all: dirsymlink
dirreal: a.out
$(RM) -r $@
mkdir $@
$(OBJCOPY) --only-keep-debug $< $@/stripped.debug
$(OBJCOPY) --strip-all --add-gnu-debuglink=$@/stripped.debug $< $@/stripped.out
dirsymlink: dirreal
$(RM) -r $@
mkdir $@
ln -s ../$</stripped.out $@/stripped.symlink
clean::
$(RM) -r dirreal dirsymlink
include $(LEVEL)/Makefile.rules

View File

@@ -0,0 +1,22 @@
""" Testing separate debug info loading for base binary with a symlink. """
import os
import time
import lldb
import sys
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class TestTargetSymbolsSepDebugSymlink(TestBase):
mydir = TestBase.compute_mydir(__file__)
@no_debug_info_test # Prevent the genaration of the dwarf version of this test
@skipUnlessPlatform(['linux'])
@skipIf(hostoslist=["windows"])
def test_target_symbols_sepdebug_symlink_case(self):
self.build(clean=True)
exe = self.getBuildArtifact("dirsymlink/stripped.symlink")
lldbutil.run_to_name_breakpoint(self, "main", exe_name = exe)

View File

@@ -0,0 +1,3 @@
int main() {
return 0;
}

View File

@@ -9,6 +9,7 @@
#include "lldb/Host/Symbols.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Target/Target.h"
#include "lldb/Utility/ArchSpec.h"
@@ -221,7 +222,11 @@ FileSpec Symbols::LocateExecutableSymbolFile(const ModuleSpec &module_spec) {
Target::GetDefaultDebugFileSearchPaths());
// Add module directory.
const ConstString &file_dir = module_spec.GetFileSpec().GetDirectory();
FileSpec module_file_spec = module_spec.GetFileSpec();
// We keep the unresolved pathname if it fails.
FileSystem::ResolveSymbolicLink(module_file_spec, module_file_spec);
const ConstString &file_dir = module_file_spec.GetDirectory();
debug_file_search_paths.AppendIfUnique(
FileSpec(file_dir.AsCString("."), true));
@@ -276,7 +281,7 @@ FileSpec Symbols::LocateExecutableSymbolFile(const ModuleSpec &module_spec) {
FileSpec file_spec(filename, true);
if (llvm::sys::fs::equivalent(file_spec.GetPath(),
module_spec.GetFileSpec().GetPath()))
module_file_spec.GetPath()))
continue;
if (file_spec.Exists()) {