11 Commits

7 changed files with 41 additions and 29 deletions

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.5) cmake_minimum_required(VERSION 3.5...3.18)
project(patchelfcrc LANGUAGES C) project(patchelfcrc LANGUAGES C)
@@ -28,12 +28,23 @@ pkg_check_modules(ELF REQUIRED libelf)
find_package(Doxygen) find_package(Doxygen)
find_package(LibXml2 REQUIRED) find_package(LibXml2 REQUIRED)
add_subdirectory(man)
aux_source_directory("src" CFILES) aux_source_directory("src" CFILES)
set(GEN_HEADER_PATH "${CMAKE_CURRENT_BINARY_DIR}/include/generated") set(GEN_HEADER_PATH "${CMAKE_CURRENT_BINARY_DIR}/include/generated")
if (DEFINED NO_VERSION_INFO)
add_custom_target(
version-header
COMMAND
mkdir -p ${GEN_HEADER_PATH} && bash "${CMAKE_CURRENT_SOURCE_DIR}/gen_version_header.sh" "${GEN_HEADER_PATH}/version.h" "dummy"
WORKING_DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Generating version header dummy"
)
set (NO_VERSION_INFO true)
message("${BoldMagenta}No Version Information will be built${ColorReset}")
else(DEFINED NO_VERSION_INFO)
add_custom_target( add_custom_target(
version-header version-header
COMMAND COMMAND
@@ -42,6 +53,8 @@ add_custom_target(
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Generating version header" COMMENT "Generating version header"
) )
add_subdirectory(man)
endif(DEFINED NO_VERSION_INFO)
add_custom_target(schema-header DEPENDS "${GEN_HEADER_PATH}/schema-blob.h") add_custom_target(schema-header DEPENDS "${GEN_HEADER_PATH}/schema-blob.h")
add_custom_command( add_custom_command(
@@ -66,9 +79,10 @@ target_link_directories(${PROJECT_NAME} PRIVATE ${ELF_LIBRARY_DIRS} ${LIBXML2_LI
target_include_directories(${PROJECT_NAME} PRIVATE ${ELF_INCLUDE_DIRS}) target_include_directories(${PROJECT_NAME} PRIVATE ${ELF_INCLUDE_DIRS})
target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include") target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/include")
target_include_directories(${PROJECT_NAME} PRIVATE "include") target_include_directories(${PROJECT_NAME} PRIVATE "include")
add_dependencies(${PROJECT_NAME} version-header schema-header) add_dependencies(${PROJECT_NAME} schema-header)
add_dependencies(${PROJECT_NAME} version-header)
if (DOXYGEN_FOUND) if (DOXYGEN_FOUND AND (NOT (DEFINED NO_VERSION_INFO)))
set(DOXYFILE_SRC "${CMAKE_CURRENT_SOURCE_DIR}/doxygen/Doxyfile.in") set(DOXYFILE_SRC "${CMAKE_CURRENT_SOURCE_DIR}/doxygen/Doxyfile.in")
set(DOXYFILE_DEST "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile") set(DOXYFILE_DEST "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")
configure_file(${DOXYFILE_SRC} ${DOXYFILE_DEST} @ONLY) configure_file(${DOXYFILE_SRC} ${DOXYFILE_DEST} @ONLY)
@@ -87,7 +101,7 @@ if (DOXYGEN_FOUND)
WORKING_DIRECTORY WORKING_DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
) )
else (DOXYGEN_FOUND) else (DOXYGEN_FOUND AND (NOT (DEFINED NO_VERSION_INFO)))
message("${BoldMagenta}Doxygen needs to be installed to generate the doxygen documentation${ColorReset}") message("${BoldMagenta}Doxygen needs to be installed to generate the doxygen documentation${ColorReset}")
message("${BoldMagenta}doxygen target will not be available${ColorReset}") message("${BoldMagenta}doxygen target will not be available${ColorReset}")
endif (DOXYGEN_FOUND) endif (DOXYGEN_FOUND AND (NOT (DEFINED NO_VERSION_INFO)))

View File

@@ -4,7 +4,12 @@ if [[ -z $1 ]]; then
exit -1; exit -1;
fi fi
ver=`git describe --tags --always --dirty` if [[ "$2" == "dummy" ]]; then
ver="v0.0.0-undefined"
else
ver=`git describe --tags --always --dirty`
fi
echo "#ifndef _VERSION_GENERATED_H_" > $1 echo "#ifndef _VERSION_GENERATED_H_" > $1
echo "#define _VERSION_GENERATED_H_" >> $1 echo "#define _VERSION_GENERATED_H_" >> $1
echo "#define GIT_VERSION_STRING \"$ver\"" >> $1 echo "#define GIT_VERSION_STRING \"$ver\"" >> $1

View File

@@ -61,7 +61,7 @@
: Export the calculated files to an XML file *XMLFILE*. : Export the calculated files to an XML file *XMLFILE*.
**--import**=*XMLFILE* **--import**=*XMLFILE*
: Import the CRCs from an XML file *XMLFILE* and do not caclulate anything in the given *ELF* : Import the CRCs from an XML file *XMLFILE* and do not calculate anything in the given *ELF*
**--help**, **-h**, **-?** **--help**, **-h**, **-?**
: Print help. : Print help.
@@ -134,8 +134,8 @@
**patchelfcrc** -l -g word --start-magic=0x12345678 --end-magic=0x8754321 -p crc-32-mpeg -f bare -O .outputsection -S .text executable.elf **patchelfcrc** -l -g word --start-magic=0x12345678 --end-magic=0x8754321 -p crc-32-mpeg -f bare -O .outputsection -S .text executable.elf
: Calculate the CRC over *.text* section and place the result in the *.outputsection* section. : Calculate the CRC over *.text* section and place the result in the *.outputsection* section.
The output sections start and end are checked for the given magic numbers in order to assure correct memory layout. The output sections start and end are checked for the given magic numbers in order to ensure correct memory layout.
*CRC-32-MPEG* is used as CRC algorothm. *CRC-32-MPEG* is used as CRC algorithm.
The memory is interpreted as *little endian* and the CRC calculation granularity is a 32 bit *word*. The memory is interpreted as *little endian* and the CRC calculation granularity is a 32 bit *word*.
# BUGS # BUGS

View File

@@ -561,25 +561,24 @@ int elf_patch_compute_crc_over_section(elfpatch_handle_t *ep, const char *sectio
/* Find section */ /* Find section */
sec = find_section_in_list(ep->sections, section); sec = find_section_in_list(ep->sections, section);
if (!sec) { if (!sec) {
print_err("Cannot find section %s\n", section); print_err("Cannot find section '%s'\n", section);
return -1; return -1;
} }
data = elf_getdata(sec->scn, NULL); data = elf_getdata(sec->scn, NULL);
if (!data) { if (!data) {
print_err("Error reading section data from %s: %s\n", section, elf_errmsg(-1)); print_err("Error reading section data from '%s': %s\n", section, elf_errmsg(-1));
return -1; return -1;
} }
print_debug("Section data length: %lu\n", data->d_size);
if (!data->d_size) { if (!data->d_size) {
print_err("Section %s contains no data.\n", section); print_err("Section '%s' contains no data.\n", section);
return -2; return -2;
} }
/* NOBIT sections have a length but no data in the file. Abort in this case */ /* NOBIT sections have a length but no data in the file. Abort in this case */
if (!data->d_buf) { if (!data->d_buf) {
print_err("Section %s does not contain loadable data.\n", section); print_err("Section '%s' does not contain loadable data.\n", section);
return -2; return -2;
} }
@@ -593,7 +592,7 @@ int elf_patch_compute_crc_over_section(elfpatch_handle_t *ep, const char *sectio
/* Check granularity vs size of section */ /* Check granularity vs size of section */
padding_count = (gran_in_bytes - data->d_size % gran_in_bytes) % gran_in_bytes; padding_count = (gran_in_bytes - data->d_size % gran_in_bytes) % gran_in_bytes;
if (padding_count) { if (padding_count) {
print_err("Section '%s' is not a multiple size of the given granularity. %u zero padding bytes will be added.\n", print_warn("Section '%s' is not a multiple size of the given granularity. %u zero padding bytes will be added.\n",
section, padding_count); section, padding_count);
} }
@@ -633,7 +632,7 @@ static size_t calculate_needed_space_for_crcs(enum crc_format format,
break; break;
default: default:
needed_space = 0; needed_space = 0;
print_err("Unsupported CRC output format\n"); print_err("Unsupported CRC output format.\n");
} }
/* Add existing magic numbers to required space */ /* Add existing magic numbers to required space */
if (check_start_magic) { if (check_start_magic) {

View File

@@ -239,12 +239,11 @@ static void prepare_default_opts(struct command_line_options *opts)
opts->output_section = NULL; opts->output_section = NULL;
opts->export_xml = NULL; opts->export_xml = NULL;
opts->import_xml = NULL; opts->import_xml = NULL;
opts->force_nocolor = false;
} }
static void print_verbose_start_info(const struct command_line_options *cmd_opts) static void print_verbose_start_info(const struct command_line_options *cmd_opts)
{ {
int i;
SlList *list_iter;
const struct named_crc *predef_crc; const struct named_crc *predef_crc;
print_debug("Start CRC patching\n"); print_debug("Start CRC patching\n");
@@ -278,11 +277,6 @@ static void print_verbose_start_info(const struct command_line_options *cmd_opts
if (cmd_opts->import_xml) if (cmd_opts->import_xml)
print_debug("Import CRCs from '%s'\n", cmd_opts->import_xml); print_debug("Import CRCs from '%s'\n", cmd_opts->import_xml);
if (cmd_opts->section_list) {
for (list_iter = cmd_opts->section_list, i = 1; list_iter; list_iter = sl_list_next(list_iter), i++)
print_debug("Input section [%d]: \"%s\"\n", i, (const char *)list_iter->data);
}
} }
static void free_cmd_args(struct command_line_options *opts) static void free_cmd_args(struct command_line_options *opts)
@@ -459,7 +453,7 @@ int main(int argc, char **argv)
print_warn("--use-vma option only has an effect when exporting as struct output.\n"); print_warn("--use-vma option only has an effect when exporting as struct output.\n");
if (!cmd_opts.output_section && cmd_opts.export_xml == NULL) if (!cmd_opts.output_section && cmd_opts.export_xml == NULL)
print_warn("No output section / XML export specified. Will continue but not create any output\n"); print_warn("No output section or XML export specified. Will continue but not create any output.\n");
/* Prepare libelf for use with the latest ELF version */ /* Prepare libelf for use with the latest ELF version */
elf_version(EV_CURRENT); elf_version(EV_CURRENT);
@@ -501,7 +495,7 @@ int main(int argc, char **argv)
if (cmd_opts.export_xml) { if (cmd_opts.export_xml) {
if (xml_write_crcs_to_file(cmd_opts.export_xml, crc_data)) { if (xml_write_crcs_to_file(cmd_opts.export_xml, crc_data)) {
print_err("Error during XML generation\n"); print_err("Error during XML generation.\n");
ret = -3; ret = -3;
} }
} }