[PATCH v1 1/1] bfd: add a mean to programatically detect a release version

Matthieu Longo matthieu.longo@arm.com
Fri Aug 15 09:01:04 GMT 2025


On 2025-08-14 16:49, Sam James wrote:
> Matthieu Longo <matthieu.longo@arm.com> writes:
> 
>> In a recent discussion around Object Attributes v2, it appeared that we
>> needed a way to detect whether a tool was built as a release version,
>> or development version.
>>
>> A previous patch (7b40f4c6587c) introduced this detection in gas.
>> This patch reuses the same principle but moved the code into a utility
>> function in bsd, so that gas, ld, and others can rely on it. It also
>> adds a Tcl function 'is_release' that can be used with a '#target: '
>> directive to disable some tests relying on development-only features.
>> ---
>>   bfd/bfd-in.h                               |  2 ++
>>   bfd/bfd-in2.h                              |  2 ++
>>   bfd/bfd.c                                  |  9 +++++++++
>>   binutils/testsuite/lib/binutils-common.exp | 13 +++++++++++++
>>   gas/as.c                                   |  2 +-
>>   5 files changed, 27 insertions(+), 1 deletion(-)
>>
>> diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
>> index df5568e9639..ad126644845 100644
>> --- a/bfd/bfd-in.h
>> +++ b/bfd/bfd-in.h
>> @@ -159,3 +159,5 @@ startswith (const char *str, const char *prefix)
>>     return strncmp (str, prefix, strlen (prefix)) == 0;
>>   }
>>   
>> +extern bool
>> +is_release_version (void);
>> diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
>> index 12512a3962c..3ce4bad278d 100644
>> --- a/bfd/bfd-in2.h
>> +++ b/bfd/bfd-in2.h
>> @@ -166,6 +166,8 @@ startswith (const char *str, const char *prefix)
>>     return strncmp (str, prefix, strlen (prefix)) == 0;
>>   }
>>   
>> +extern bool
>> +is_release_version (void);
>>   /* Extracted from libbfd.c.  */
>>   void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
>>   
>> diff --git a/bfd/bfd.c b/bfd/bfd.c
>> index 4aded6809bb..aaa04cdeba9 100644
>> --- a/bfd/bfd.c
>> +++ b/bfd/bfd.c
>> @@ -3103,3 +3103,12 @@ bfd_group_signature (asection *group, asymbol **isympp)
>>       }
>>     return NULL;
>>   }
>> +
>> +/* Return True if the current tool artifact is a development version or a
>> +   release version.  */
>> +
>> +bool
>> +is_release_version ()
>> +{
>> +  return strstr (BFD_VERSION_STRING, "." XSTRING (BFD_VERSION_DATE)) == NULL;
>> +}
>> diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
>> index 2ee859aa3eb..435d2108378 100644
>> --- a/binutils/testsuite/lib/binutils-common.exp
>> +++ b/binutils/testsuite/lib/binutils-common.exp
>> @@ -17,6 +17,19 @@
>>   # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
>>   # MA 02110-1301, USA.
>>   
>> +# True if the current tool is a release version.
>> +#
>> +proc is_release {} {
>> +  global AS
>> +  catch "exec $AS --version | head -1" exec_output
> 
> Do head -n1. head -1 isn't POSIX.
> 

Fixed.

>> +  if [regexp {\d+\.\d+\.\d+(\.\d+)} $exec_output matched sub1] then {
>> +    if {$sub1 eq ""} {
>> +      return 1
>> +    }
>> +  }
>> +  return 0
>> +}
>> +
>>   # True if the object format is known to be ELF.
>>   #
>>   proc is_elf_format {} {
>> diff --git a/gas/as.c b/gas/as.c
>> index 58ed0a59e21..4e8f6a4aa02 100644
>> --- a/gas/as.c
>> +++ b/gas/as.c
>> @@ -1243,7 +1243,7 @@ perform_an_assembly_pass (int argc, char ** argv)
>>   #endif
>>   
>>     predefine_symbol ("version", BFD_VERSION);
>> -  if (strstr (BFD_VERSION_STRING, "." XSTRING (BFD_VERSION_DATE)) != NULL)
>> +  if (!is_release_version ())
>>       predefine_symbol ("date", BFD_VERSION_DATE);
>>   
>>     /* This may add symbol table entries, which requires having an open BFD,



More information about the Binutils mailing list