From: Michael Tremer Date: Fri, 17 Mar 2023 13:56:40 +0000 (+0000) Subject: build: Move strip check into file check X-Git-Tag: 0.9.29~271 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=03a5ac9534e0ae66752cc647f4f45c446490fc0d;p=pakfire.git build: Move strip check into file check Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index 5ea9e7650..4234be712 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -1109,35 +1109,6 @@ static int pakfire_build_post_remove_static_libraries( 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; @@ -1276,11 +1247,6 @@ static int pakfire_build_run_post_build_checks(struct pakfire_build* build) { 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) diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index b4b599a7b..24a76553e 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -623,6 +623,12 @@ char* pakfire_file_dump(struct pakfire_file* file, int flags) { 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) { @@ -1692,7 +1698,7 @@ static int pakfire_file_get_elf_type(struct pakfire_file* file) { 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; @@ -1715,20 +1721,13 @@ static int __pakfire_file_is_stripped(struct pakfire_file* file, Elf* elf, void* // 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: @@ -1739,7 +1738,7 @@ int pakfire_file_is_stripped(struct pakfire_file* file) { 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( @@ -1811,6 +1810,10 @@ static int pakfire_file_check_ssp(struct pakfire_file* file) { 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); } @@ -1948,6 +1951,11 @@ int pakfire_file_check(struct pakfire_file* file, int* issues) { 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) diff --git a/src/libpakfire/include/pakfire/file.h b/src/libpakfire/include/pakfire/file.h index 253619101..d6f4e5588 100644 --- a/src/libpakfire/include/pakfire/file.h +++ b/src/libpakfire/include/pakfire/file.h @@ -177,13 +177,13 @@ int pakfire_file_verify(struct pakfire_file* file, int* status); */ 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