From 730c84556bc2d2761c1c4ea00903ee4df9c3b091 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 26 Oct 2024 16:06:46 +0000 Subject: [PATCH] linter: Check if ELF files have a debug link Signed-off-by: Michael Tremer --- Makefile.am | 2 ++ configure.ac | 1 + src/libpakfire/linter-file.c | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/Makefile.am b/Makefile.am index 97b6ee1fe..f3dc12dd6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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) \ diff --git a/configure.ac b/configure.ac index 4d19764b7..d172344d0 100644 --- a/configure.ac +++ b/configure.ac @@ -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}])]) diff --git a/src/libpakfire/linter-file.c b/src/libpakfire/linter-file.c index b40e8ff6b..d6b862778 100644 --- a/src/libpakfire/linter-file.c +++ b/src/libpakfire/linter-file.c @@ -23,6 +23,7 @@ // libelf #include +#include #include #include @@ -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) -- 2.39.5