summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2021-07-06 11:36:16 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-07-20 19:05:45 +0100
commit4c9118c95ca81dc6044bbcb7bb96b15505de086f (patch)
treefcb38f1ea6ec31c33ca14dabf041009c29993c62 /meta
parentfccb368fd124fd8992cd571698bb48f12f7cd5db (diff)
downloadpoky-4c9118c95ca81dc6044bbcb7bb96b15505de086f.tar.gz
dwarfsrcfiles: Avoid races over debug-link files
We use dwarfsrcfiles in package.bbclass to list the source files used by a binary. This is done before they're stripped and linked to debug symbols in separate files. It is possible a binary may already have a link to separate debug symbols, e.g. some of the test binaries in lttng-tools ptest. In those cases, the linked binary may be changed by package.bbclass code whilst dwarfsrcfiles is reading it. That would result in a rare SIGBUS race causing the binary to fail. To avoid this, break the debug file search path so no other binaries are found. Also fix a segfault if no binary is specified while here. [YOCTO #14400] (From OE-Core rev: 52382a03c10a6985ecb6ada24523cb9daf9c6201) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit efef732859e265533acf16f2f4da3b29d50e0df4) Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/recipes-devtools/dwarfsrcfiles/files/dwarfsrcfiles.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/meta/recipes-devtools/dwarfsrcfiles/files/dwarfsrcfiles.c b/meta/recipes-devtools/dwarfsrcfiles/files/dwarfsrcfiles.c
index af7af524eb..9eb5ca807a 100644
--- a/meta/recipes-devtools/dwarfsrcfiles/files/dwarfsrcfiles.c
+++ b/meta/recipes-devtools/dwarfsrcfiles/files/dwarfsrcfiles.c
@@ -9,6 +9,7 @@
9 9
10#include <argp.h> 10#include <argp.h>
11#include <stdio.h> 11#include <stdio.h>
12#include <stdlib.h>
12 13
13#include <dwarf.h> 14#include <dwarf.h>
14#include <elfutils/libdw.h> 15#include <elfutils/libdw.h>
@@ -83,13 +84,15 @@ process_cu (Dwarf_Die *cu_die)
83int 84int
84main (int argc, char **argv) 85main (int argc, char **argv)
85{ 86{
86 char* args[3]; 87 char* args[5];
87 int res = 0; 88 int res = 0;
88 Dwfl *dwfl; 89 Dwfl *dwfl;
89 Dwarf_Addr bias; 90 Dwarf_Addr bias;
90 91
91 if (argc != 2) 92 if (argc != 2) {
92 fprintf(stderr, "Usage %s <file>", argv[0]); 93 fprintf(stderr, "Usage %s <file>", argv[0]);
94 exit(EXIT_FAILURE);
95 }
93 96
94 // Pretend "dwarfsrcfiles -e <file>" was given, so we can use standard 97 // Pretend "dwarfsrcfiles -e <file>" was given, so we can use standard
95 // dwfl argp parser to open the file for us and get our Dwfl. Useful 98 // dwfl argp parser to open the file for us and get our Dwfl. Useful
@@ -98,8 +101,12 @@ main (int argc, char **argv)
98 args[0] = argv[0]; 101 args[0] = argv[0];
99 args[1] = "-e"; 102 args[1] = "-e";
100 args[2] = argv[1]; 103 args[2] = argv[1];
104 // We don't want to follow debug linked files due to the way OE processes
105 // files, could race against changes in the linked binary (e.g. objcopy on it)
106 args[3] = "--debuginfo-path";
107 args[4] = "/not/exist";
101 108
102 argp_parse (dwfl_standard_argp (), 3, args, 0, NULL, &dwfl); 109 argp_parse (dwfl_standard_argp (), 5, args, 0, NULL, &dwfl);
103 110
104 Dwarf_Die *cu = NULL; 111 Dwarf_Die *cu = NULL;
105 while ((cu = dwfl_nextcu (dwfl, cu, &bias)) != NULL) 112 while ((cu = dwfl_nextcu (dwfl, cu, &bias)) != NULL)