]> git.ipfire.org Git - people/ric9/pakfire.git/commitdiff
stripper: Extract the GNU Build ID
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Dec 2024 20:03:58 +0000 (20:03 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Dec 2024 20:03:58 +0000 (20:03 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/build.c
src/libpakfire/stripper.c

index 95d199f51c7ed05ab4533fd965c94251ebd746e4..49a6e1a62d1d2eb517833d536d2ddc95af7b5cdb 100644 (file)
@@ -1273,7 +1273,7 @@ ERROR:
 
 static const char* post_build_scripts[] = {
        "compress-man-pages",
-       "strip",
+       // "strip",
        NULL,
 };
 
index bd68e05111b03d2fc123cd97feb60d23f321a0ff..3dcde46206937a250feb89c97c309693ab1078cd 100644 (file)
 
 // libdw
 #include <elfutils/libdw.h>
+#include <elfutils/libdwelf.h>
 
 #include <pakfire/filelist.h>
+#include <pakfire/hex.h>
 #include <pakfire/i18n.h>
 #include <pakfire/pakfire.h>
 #include <pakfire/path.h>
@@ -163,6 +165,42 @@ ERROR:
        return r;
 }
 
+static int pakfire_stripper_extract_build_id(struct pakfire_stripper* stripper,
+               struct pakfire_file* file, int fd, char** build_id) {
+       Elf* elf = NULL;
+       const void* buffer = NULL;
+       ssize_t length = -1;
+       int r = 0;
+
+       elf = elf_begin(fd, ELF_C_READ, NULL);
+       if (!elf) {
+               ERROR(stripper->ctx, "Could not open ELF file %s: %s\n",
+                       pakfire_file_get_path(file), elf_errmsg(-1));
+               r = -ENOTSUP;
+               goto ERROR;
+       }
+
+       // Extract the GNU Build ID
+       length = dwelf_elf_gnu_build_id(elf, &buffer);
+       if (length < 0) {
+               ERROR(stripper->ctx, "Could not read the GNU Build ID from %s: %s\n",
+                       pakfire_file_get_path(file), elf_errmsg(-1));
+               r = -ENOTSUP;
+               goto ERROR;
+       }
+
+       // Convert the Build ID to hex
+       *build_id = __pakfire_hexlify(buffer, length);
+
+       DEBUG(stripper->ctx, "%s has Build ID %s\n", pakfire_file_get_path(file), *build_id);
+
+ERROR:
+       if (elf)
+               elf_end(elf);
+
+       return r;
+}
+
 static int pakfire_stripper_copy_source_file(
                struct pakfire_stripper* stripper, const char* filename) {
        struct stat st = {};
@@ -352,6 +390,7 @@ ERROR:
 static int pakfire_stripper_strip(
                struct pakfire_ctx* ctx, struct pakfire_file* file, void* data) {
        struct pakfire_stripper* stripper = data;
+       char* build_id = NULL;
        int fd = -EBADF;
        int r;
 
@@ -362,12 +401,19 @@ static int pakfire_stripper_strip(
                goto ERROR;
        }
 
+       // Extract the Build ID
+       r = pakfire_stripper_extract_build_id(stripper, file, fd, &build_id);
+       if (r < 0)
+               goto ERROR;
+
        // Copy sources
        r = pakfire_stripper_copy_sources(stripper, file, fd);
        if (r < 0)
                goto ERROR;
 
 ERROR:
+       if (build_id)
+               free(build_id);
        if (fd >= 0)
                close(fd);