summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2025-08-05 01:43:24 +0200
committerSlávek Banko <slavek.banko@axis.cz>2025-08-05 01:43:36 +0200
commitc57eae31615bc70072c7e99d712c2285817bd2e5 (patch)
treef3dab83874de1a013cc72164fe9cc0e8e5c48df7
parent090b467fe2ab0274cee1e20b46fc1eec05f40bb8 (diff)
downloadlibr-c57eae31615bc70072c7e99d712c2285817bd2e5.tar.gz
libr-c57eae31615bc70072c7e99d712c2285817bd2e5.zip
Update for API change in binutils 2.45.HEADmaster
Simplify binutils version definitions. Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
-rw-r--r--CMakeLists.txt18
-rw-r--r--src/config.h.cmake4
-rw-r--r--src/libr-bfd.c28
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)