summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2018-02-05 10:50:38 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2018-02-05 10:50:38 +0000
commit401df580641bd6be73d37a0dbb65e7348263fd8a (patch)
tree5ca9712b22a57dc6a4e92a6acf03702e7bbd2c7c
parent10392cdbf7fa417976d003e10fae871aedaab322 (diff)
downloadbcm5719-llvm-401df580641bd6be73d37a0dbb65e7348263fd8a.tar.gz
bcm5719-llvm-401df580641bd6be73d37a0dbb65e7348263fd8a.zip
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
-rw-r--r--lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/Makefile20
-rw-r--r--lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/TestTargetSymbolsSepDebugSymlink.py22
-rw-r--r--lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/main.c3
-rw-r--r--lldb/source/Host/common/Symbols.cpp9
4 files changed, 52 insertions, 2 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/Makefile b/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/Makefile
new file mode 100644
index 00000000000..3fd14a74bf3
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/Makefile
@@ -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
diff --git a/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/TestTargetSymbolsSepDebugSymlink.py b/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/TestTargetSymbolsSepDebugSymlink.py
new file mode 100644
index 00000000000..51866df48d3
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/TestTargetSymbolsSepDebugSymlink.py
@@ -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)
diff --git a/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/main.c b/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/main.c
new file mode 100644
index 00000000000..4cce7f667ff
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/linux/sepdebugsymlink/main.c
@@ -0,0 +1,3 @@
+int main() {
+ return 0;
+}
diff --git a/lldb/source/Host/common/Symbols.cpp b/lldb/source/Host/common/Symbols.cpp
index 3f7afab794b..0bbee7adf8e 100644
--- a/lldb/source/Host/common/Symbols.cpp
+++ b/lldb/source/Host/common/Symbols.cpp
@@ -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()) {
OpenPOWER on IntegriCloud