#include <elfutils/libdw.h>
#include <elfutils/libdwelf.h>
+#include <pakfire/elf.h>
#include <pakfire/filelist.h>
#include <pakfire/hex.h>
#include <pakfire/i18n.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) {
char srcpath[PATH_MAX];
}
static int pakfire_stripper_strip_debug_sections(struct pakfire_stripper* stripper,
- struct pakfire_file* file, const char* build_id) {
+ struct pakfire_file* file, struct pakfire_elf* elf) {
+ const char* build_id = NULL;
char build_id_path[PATH_MAX];
char tmppath[PATH_MAX] = "";
const char* path = NULL;
// Fetch the path
path = pakfire_file_get_abspath(file);
+ // Fetch the Build ID
+ build_id = pakfire_elf_build_id(elf);
+ if (!build_id) {
+ ERROR(stripper->ctx, "No Build ID\n");
+ r = -ENOTSUP;
+ goto ERROR;
+ }
+
// Make Build ID path
r = pakfire_stripper_build_id_path(stripper, build_id_path, build_id);
if (r < 0)
static int pakfire_stripper_strip(
struct pakfire_ctx* ctx, struct pakfire_file* file, void* data) {
struct pakfire_stripper* stripper = data;
- char* build_id = NULL;
+ struct pakfire_elf* elf = NULL;
int fd = -EBADF;
int r;
goto ERROR;
}
- // Extract the Build ID
- r = pakfire_stripper_extract_build_id(stripper, file, fd, &build_id);
+ // Open the ELF file
+ r = pakfire_elf_open_file(&elf, stripper->ctx, file);
if (r < 0)
goto ERROR;
goto ERROR;
// Strip debug information
- r = pakfire_stripper_strip_debug_sections(stripper, file, build_id);
+ r = pakfire_stripper_strip_debug_sections(stripper, file, elf);
if (r < 0)
goto ERROR;
ERROR:
- if (build_id)
- free(build_id);
+ if (elf)
+ pakfire_elf_unref(elf);
if (fd >= 0)
close(fd);