diff options
author | Slávek Banko <slavek.banko@axis.cz> | 2025-08-05 01:43:24 +0200 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2025-08-05 01:43:36 +0200 |
commit | c57eae31615bc70072c7e99d712c2285817bd2e5 (patch) | |
tree | f3dab83874de1a013cc72164fe9cc0e8e5c48df7 | |
parent | 090b467fe2ab0274cee1e20b46fc1eec05f40bb8 (diff) | |
download | libr-c57eae31615bc70072c7e99d712c2285817bd2e5.tar.gz libr-c57eae31615bc70072c7e99d712c2285817bd2e5.zip |
Simplify binutils version definitions.
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
-rw-r--r-- | CMakeLists.txt | 18 | ||||
-rw-r--r-- | src/config.h.cmake | 4 | ||||
-rw-r--r-- | src/libr-bfd.c | 28 |
3 files changed, 34 insertions, 16 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 743cb65..e7bbf15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,15 +59,27 @@ option( WITH_GTK "Build support for GTK" OFF ) #### configure checks ########################### if( WITH_BACKEND_LIBBFD ) + message( STATUS "Checking linker version" ) + execute_process( + COMMAND ${CMAKE_LINKER} --version + OUTPUT_VARIABLE _linker_version + ERROR_VARIABLE _linker_version + ) + string( REGEX REPLACE "^GNU [^\n]* ([^ ]*)\n.*" "\\1" LINKER_VERSION ${_linker_version} ) + string( REGEX MATCH "^([0-9]+)\\.([0-9]+)(\\.([0-9]+))?.*" LINKER_VERSION_MATCH ${LINKER_VERSION} ) + math( EXPR LINKER_VERSION_MAJOR "${CMAKE_MATCH_1}+0" ) + math( EXPR LINKER_VERSION_MINOR "${CMAKE_MATCH_2}+0" ) + math( EXPR LINKER_VERSION_PATCH "${CMAKE_MATCH_4}+0" ) + math( EXPR LINKER_VERSION_C "(${LINKER_VERSION_MAJOR}*1000000) + (${LINKER_VERSION_MINOR}*1000) + ${LINKER_VERSION_PATCH}" ) + set( LINKER_VERSION_C ${LINKER_VERSION_C} CACHE INTERNAL "Linker version as code number" ) + message( STATUS "Checking linker version - ${LINKER_VERSION}" ) + tde_save_and_set( CMAKE_REQUIRED_DEFINITIONS "-DPACKAGE" "-DPACKAGE_VERSION" ) check_include_file( bfd.h HAVE_BFD_H ) if( NOT HAVE_BFD_H ) tde_message_fatal( "Could not find libbfd header file (bfd.h)!\nThis file is usually included in the package binutils-dev." ) endif( NOT HAVE_BFD_H ) - tde_save_and_set( CMAKE_REQUIRED_LIBRARIES "bfd" ) - check_symbol_exists( bfd_asymbol_section bfd.h HAVE_BFD_2_34 ) tde_restore( CMAKE_REQUIRED_DEFINITIONS ) - tde_restore( CMAKE_REQUIRED_LIBRARIES ) set( BACKEND_LIBRARIES "-lbfd" ) set( LIBR_BACKEND "bfd" ) set( BACKEND_NAME "libbfd" ) diff --git a/src/config.h.cmake b/src/config.h.cmake index 34fe955..8842734 100644 --- a/src/config.h.cmake +++ b/src/config.h.cmake @@ -8,5 +8,5 @@ language is requested. */ #define ENABLE_NLS 1 -/* Define to 1 if you have Binutils >= 2.34 */ -#cmakedefine HAVE_BFD_2_34 1 +/* Define Binutils linker version code */ +#cmakedefine LINKER_VERSION_C @LINKER_VERSION_C@ diff --git a/src/libr-bfd.c b/src/libr-bfd.c index 53e8aee..7d72036 100644 --- a/src/libr-bfd.c +++ b/src/libr-bfd.c @@ -114,7 +114,7 @@ int keep_symbol(libr_section *sections, libr_section *chkscn) { /* if it is, and has size zero, then it was marked for deletion */ if( - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) bfd_section_size(chkscn) == 0 #else bfd_get_section_size(chkscn) == 0 @@ -144,7 +144,7 @@ void remove_sections(libr_section *sections, void *symtab_buffer, long *symtab_c if(symbol != NULL) { - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) chkscn = bfd_asymbol_section(symbol); #else chkscn = bfd_get_section(symbol); @@ -171,7 +171,7 @@ int setup_sections(bfd *ihandle, bfd *ohandle) for(iscn = ihandle->sections; iscn != NULL; iscn = iscn->next) { if( - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) bfd_section_size(iscn) == 0 #else bfd_get_section_size(iscn) == 0 @@ -199,7 +199,7 @@ int setup_sections(bfd *ihandle, bfd *ohandle) return false; } if( - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) !bfd_set_section_size(oscn, iscn->size) #else !bfd_set_section_size(ohandle, oscn, iscn->size) @@ -209,13 +209,13 @@ int setup_sections(bfd *ihandle, bfd *ohandle) printf("failed to set data size: %s\n", bfd_errmsg(bfd_get_error())); return false; } - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) vma = bfd_section_vma(iscn); #else vma = bfd_section_vma(ihandle, iscn); #endif if( - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) !bfd_set_section_vma(oscn, vma) #else !bfd_set_section_vma(ohandle, oscn, vma) @@ -227,7 +227,7 @@ int setup_sections(bfd *ihandle, bfd *ohandle) } oscn->lma = iscn->lma; if( - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) !bfd_set_section_alignment(oscn, bfd_section_alignment(iscn)) #else !bfd_set_section_alignment(ohandle, oscn, bfd_section_alignment(ihandle, iscn)) @@ -240,7 +240,13 @@ int setup_sections(bfd *ihandle, bfd *ohandle) oscn->entsize = iscn->entsize; iscn->output_section = oscn; iscn->output_offset = vma; - if(!bfd_copy_private_section_data(ihandle, iscn, ohandle, oscn)) + if( + #if (LINKER_VERSION_C >= 2045000) + !bfd_copy_private_section_data(ihandle, iscn, ohandle, oscn, NULL) + #else + !bfd_copy_private_section_data(ihandle, iscn, ohandle, oscn) + #endif + ) { printf("failed to compute section alignment: %s\n", bfd_errmsg(bfd_get_error())); return false; @@ -304,7 +310,7 @@ int build_output(libr_file *file_handle) /* Actually copy section data */ for(iscn = ihandle->sections; iscn != NULL; iscn = iscn->next) { - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) size = bfd_section_size(iscn); #else size = bfd_get_section_size(iscn); @@ -323,7 +329,7 @@ int build_output(libr_file *file_handle) } if( - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) bfd_section_flags(iscn) & SEC_HAS_CONTENTS #else bfd_get_section_flags(ihandle, iscn) & SEC_HAS_CONTENTS @@ -548,7 +554,7 @@ libr_intstatus add_section(libr_file *file_handle, char *resource_name, libr_sec if(scn == NULL) RETURN(LIBR_ERROR_NEWSECTION, "Failed to create new section"); if( - #ifdef HAVE_BFD_2_34 + #if (LINKER_VERSION_C >= 2034000) !bfd_set_section_flags(scn, SEC_HAS_CONTENTS | SEC_DATA | SEC_IN_MEMORY) #else !bfd_set_section_flags(file_handle->bfd_read, scn, SEC_HAS_CONTENTS | SEC_DATA | SEC_IN_MEMORY) |