]> git.ipfire.org Git - pakfire.git/commitdiff
linter: Check if ELF files have a debug link
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 26 Oct 2024 16:06:46 +0000 (16:06 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 26 Oct 2024 16:06:46 +0000 (16:06 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
configure.ac
src/libpakfire/linter-file.c

index 97b6ee1fe9ef48e28d4598f7136259f93b5cc4b7..f3dc12dd618ad7b6f8061702016c8a3c44e28930 100644 (file)
@@ -299,6 +299,7 @@ libpakfire_la_CFLAGS = \
        $(BPF_CFLAGS) \
        $(CAP_CFLAGS) \
        $(CURL_CFLAGS) \
+       $(DW_CFLAGS) \
        $(ELF_CFLAGS) \
        $(JSON_C_CFLAGS) \
        $(KRB5_CFLAGS) \
@@ -331,6 +332,7 @@ libpakfire_la_LIBADD = \
        $(BPF_LIBS) \
        $(CAP_LIBS) \
        $(CURL_LIBS) \
+       $(DW_LIBS) \
        $(ELF_LIBS) \
        $(JSON_C_LIBS) \
        $(KRB5_LIBS) \
index 4d19764b767a6985a2e1fea5358d5826066afe48..d172344d090409224117d3d155755e36168544c2 100644 (file)
@@ -268,6 +268,7 @@ PKG_CHECK_MODULES([ARCHIVE], [libarchive >= 3.4.0])
 PKG_CHECK_MODULES([BPF], [libbpf])
 PKG_CHECK_MODULES([CAP], [libcap])
 PKG_CHECK_MODULES([CURL], [libcurl])
+PKG_CHECK_MODULES([DW], [libdw])
 PKG_CHECK_MODULES([ELF], [libelf])
 PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}-embed],
        [], [PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}])])
index b40e8ff6b8e8395c50f213a0083097a16d0a9096..d6b8627783d880e27d893a1337c535fba1346342 100644 (file)
@@ -23,6 +23,7 @@
 
 // libelf
 #include <gelf.h>
+#include <elfutils/libdwelf.h>
 
 #include <pakfire/ctx.h>
 #include <pakfire/file.h>
@@ -844,6 +845,25 @@ static int pakfire_linter_file_is_stripped(struct pakfire_linter_file* lfile) {
        return pakfire_linter_file_elf(lfile, __pakfire_linter_file_is_stripped, NULL);
 }
 
+static int __pakfire_linter_file_has_debuglink(
+               struct pakfire_linter_file* lfile, Elf* elf, void* data) {
+       const char* name = NULL;
+       GElf_Word crc32;
+
+       // Fetch the debug link
+       name = dwelf_elf_gnu_debuglink(elf, &crc32);
+       if (!name)
+               return pakfire_linter_file_error(lfile, "Missing Debug Link");
+
+       DEBUG(lfile->ctx, "%s has debug link pointing at %s\n", lfile->path, name);
+
+       return 0;
+}
+
+static int pakfire_linter_file_has_debuglink(struct pakfire_linter_file* lfile) {
+       return pakfire_linter_file_elf(lfile, __pakfire_linter_file_has_debuglink, NULL);
+}
+
 int pakfire_linter_file_lint(struct pakfire_linter_file* lfile) {
        int r = 0;
 
@@ -871,6 +891,11 @@ int pakfire_linter_file_lint(struct pakfire_linter_file* lfile) {
                if (r < 0)
                        return r;
 
+               // Check if we have a debug link
+               r = pakfire_linter_file_has_debuglink(lfile);
+               if (r < 0)
+                       return r;
+
                // Check PIE
                r = pakfire_linter_file_check_pie(lfile);
                if (r < 0)