PAKFIRE_BUILD_CLEANUP_FILES);
}
-static int __pakfire_build_post_check_stripped(
- struct pakfire* pakfire, struct pakfire_file* file, void* data) {
- struct pakfire_filelist* filelist = (struct pakfire_filelist*)data;
- int r;
-
- // Skip anything that isn't an ELF file
- if (!pakfire_file_matches_class(file, PAKFIRE_FILE_ELF))
- return 0;
-
- // Collect all stripped files
- if (pakfire_file_is_stripped(file)) {
- r = pakfire_filelist_add(filelist, file);
- if (r) {
- ERROR(pakfire, "Could not add file to filelist: %m\n");
- return r;
- }
- }
-
- return 0;
-}
-
-static int pakfire_build_post_check_stripped(
- struct pakfire_build* build, struct pakfire_filelist* filelist) {
- return pakfire_build_post_process_files(build, filelist,
- "Files lacking debugging information:",
- __pakfire_build_post_check_stripped,
- PAKFIRE_BUILD_ERROR_IF_NOT_EMPTY);
-}
-
static int __pakfire_build_remove_libtool_archives(
struct pakfire* pakfire, struct pakfire_file* file, void* data) {
struct pakfire_filelist* removees = (struct pakfire_filelist*)data;
goto ERROR;
}
- // Check if binaries have been stripped
- r = pakfire_build_post_check_stripped(build, filelist);
- if (r)
- goto ERROR;
-
// Remove any static libraries
r = pakfire_build_post_remove_static_libraries(build, filelist);
if (r)
goto ERROR;
}
+ if (file->issues & PAKFIRE_FILE_MISSING_DEBUGINFO) {
+ r = asprintf(&buffer, "%s [MISSING-DEBUGINFO]", buffer);
+ if (r < 0)
+ goto ERROR;
+ }
+
if (pakfire_file_matches_class(file, PAKFIRE_FILE_ELF)) {
// Stack-smashing Protection
if (file->issues & PAKFIRE_FILE_NO_SSP) {
return type;
}
-static int __pakfire_file_is_stripped(struct pakfire_file* file, Elf* elf, void* data) {
+static int __pakfire_file_check_debuginfo(struct pakfire_file* file, Elf* elf, void* data) {
Elf_Scn* section = NULL;
GElf_Shdr shdr;
// Not found
DEBUG(file->pakfire, "%s has no debug sections\n", file->path);
- return 1;
-}
+ // Store the result
+ file->issues |= PAKFIRE_FILE_MISSING_DEBUGINFO;
-int pakfire_file_is_stripped(struct pakfire_file* file) {
- // Don't run this for non-ELF files
- if (!pakfire_file_matches_class(file, PAKFIRE_FILE_ELF)) {
- errno = EINVAL;
- return -1;
- }
-
- // Do not perform this check on firmware
- if (pakfire_file_matches_class(file, PAKFIRE_FILE_FIRMWARE))
- return 0;
+ return 0;
+}
+static int pakfire_file_check_debuginfo(struct pakfire_file* file) {
switch (pakfire_file_get_elf_type(file)) {
// Do not check Relocatable Objects
case ET_REL:
break;
}
- return pakfire_file_open_elf(file, __pakfire_file_is_stripped, NULL);
+ return pakfire_file_open_elf(file, __pakfire_file_check_debuginfo, NULL);
}
static int __pakfire_file_check_ssp(
if (pakfire_file_matches_class(file, PAKFIRE_FILE_RUNTIME_LINKER))
return 0;
+ // We cannot perform this check if we don't have debuginfo
+ if (file->issues & PAKFIRE_FILE_MISSING_DEBUGINFO)
+ return 0;
+
return pakfire_file_open_elf(file, __pakfire_file_check_ssp, NULL);
}
break;
}
+ // Check if the file has debug info
+ r = pakfire_file_check_debuginfo(file);
+ if (r)
+ return r;
+
// Check for SSP
r = pakfire_file_check_ssp(file);
if (r)
*/
enum pakfire_file_check_issues {
PAKFIRE_FILE_FHS_ERROR = (1 << 0),
- PAKFIRE_FILE_NO_SSP = (1 << 1),
- PAKFIRE_FILE_NO_PIE = (1 << 2),
- PAKFIRE_FILE_EXECSTACK = (1 << 3),
- PAKFIRE_FILE_NO_PARTIALLY_RELRO = (1 << 4),
+ PAKFIRE_FILE_MISSING_DEBUGINFO = (1 << 1),
+ PAKFIRE_FILE_NO_SSP = (1 << 2),
+ PAKFIRE_FILE_NO_PIE = (1 << 3),
+ PAKFIRE_FILE_EXECSTACK = (1 << 4),
+ PAKFIRE_FILE_NO_PARTIALLY_RELRO = (1 << 5),
};
-int pakfire_file_is_stripped(struct pakfire_file* file);
int pakfire_file_check(struct pakfire_file* file, int* issues);
#endif