[PATCH] Add support for IMPORT_CONST in ILF (MSVC style) import libraries

Alan Modra amodra@gmail.com
Sun Jan 12 10:06:34 GMT 2025


On Sat, Jan 11, 2025 at 09:04:24PM +0200, Martin Storsjö wrote:
> This is a very strange and obsolete kind of import type; it is
> used for imported data just like IMPORT_DATA - but with an extra
> odd caveat.
> 
> The behaviour is explained at [1]; generating such import libraries
> with current MSVC tools produces "warning LNK4087: CONSTANT keyword is
> obsolete; use DATA".
> 
> While obsolete, some import libraries within the Microsoft WDK (Windows
> Driver Kit) do contain such symbols, which currently are ignored by
> binutils and produce warnings about "file format not recognized".
> 
> For IMPORT_CONST for a DLL exported symbol "foo", we should provide
> the import library symbols "__imp_foo" and "foo". For IMPORT_DATA, we
> only provide "__imp_foo", and for IMPORT_CODE, "foo" points at a thunk.
> The odd/surprising thing for IMPORT_CONST is that the "foo" symbol also
> points at the same thing as "__imp_foo", i.e. directly at the IAT
> entry.
> 
> [1] https://learn.microsoft.com/en-us/cpp/build/importing-using-def-files
> 
> Signed-off-by: Martin Storsjö <martin@martin.st>
> ---
>  bfd/peicode.h | 13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/bfd/peicode.h b/bfd/peicode.h
> index c48953dfee6..ad4f1963b9c 100644
> --- a/bfd/peicode.h
> +++ b/bfd/peicode.h
> @@ -815,14 +815,8 @@ pe_ILF_build_a_bfd (bfd *	    abfd,
>      {
>      case IMPORT_CODE:
>      case IMPORT_DATA:
> -      break;
> -
>      case IMPORT_CONST:
> -      /* XXX code yet to be written.  */
> -      /* xgettext:c-format */
> -      _bfd_error_handler (_("%pB: unhandled import type; %x"),
> -			  abfd, import_type);
> -      return false;
> +      break;
>  
>      default:
>        /* xgettext:c-format */
> @@ -1082,6 +1076,7 @@ pe_ILF_build_a_bfd (bfd *	    abfd,
>        break;
>  
>      case IMPORT_DATA:
> +    case IMPORT_CONST:
>        break;
>  
>      default:
> @@ -1102,6 +1097,10 @@ pe_ILF_build_a_bfd (bfd *	    abfd,
>        /* Nothing to do here.  */
>        break;
>  
> +    case IMPORT_CONST:
> +      pe_ILF_make_a_symbol (&vars, "", symbol_name, id5, 0);
> +      break;
> +
>      default:
>        /* XXX code not yet written.  */
>        abort ();
> -- 
> 2.43.0

OK.

-- 
Alan Modra


More information about the Binutils mailing list