// 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>
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 = {};
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;
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);