#include <sys/sendfile.h>
#include <sys/stat.h>
-// libbfd
-#include <bfd.h>
-
// libdw
#include <elfutils/libdw.h>
#include <elfutils/libdwelf.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;
- bfd* abfd = NULL;
char* build_id = NULL;
int fd = -EBADF;
int r;
- // Initialize libbfd
- bfd_init();
-
- // Fetch path
- const char* path = pakfire_file_get_path(file);
-
// Open the file
fd = pakfire_file_open(file);
if (fd < 0) {
goto ERROR;
}
- // Open the ELF object
- abfd = bfd_fdopenr(path, NULL, fd);
- if (!abfd) {
- ERROR(stripper->ctx, "Could not open ELF file %s: %s\n",
- path, bfd_errmsg(bfd_get_error()));
- r = -EINVAL;
- goto ERROR;
- }
-
- // Check if this is an ELF object
- if (!bfd_check_format(abfd, bfd_object)) {
- ERROR(stripper->ctx, "%s is not an ELF object\n", path);
- r = -ENOTSUP;
- goto ERROR;
- }
-
// Extract the Build ID
- if (abfd->build_id) {
- build_id = __pakfire_hexlify(abfd->build_id->data, abfd->build_id->size);
- if (!build_id) {
- ERROR(stripper->ctx, "Could not convert the Build ID\n");
- r = -EINVAL;
- goto ERROR;
- }
- }
+ 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);
goto ERROR;
ERROR:
- if (abfd)
- bfd_close(abfd);
if (build_id)
free(build_id);
if (fd >= 0)