#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;
}
- // Extract the Build ID
- r = pakfire_stripper_extract_build_id(stripper, file, fd, &build_id);
- if (r < 0)
+ // 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;
+ }
+ }
// 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)