Re: pe_ILF_object_p and bfd_check_format_matches
authorAlan Modra <amodra@gmail.com>
Thu, 13 Apr 2023 02:14:41 +0000 (11:44 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 13 Apr 2023 02:56:00 +0000 (12:26 +0930)
commit5d1fefd3b35589d792e5bff800d2bb7e9c4431e2
tree6b45cc40038a212c3031a4f7341106ed5304e8fb
parent89558daae726d14f33a0dd65178527c072b158cd
Re: pe_ILF_object_p and bfd_check_format_matches

The last patch wasn't quite correct.  bfd_preserve_restore also needs
to handle an in-memory to file backed transition, seen in a testcase
ILF object matching both pei-arm-little and pei-arm-wince-little.
There the first match is saved in preserve_match, and restored at the
end of the bfd_check_format_matches loop making the bfd in-memory.  On
finding more than one match the function wants to restore the bfd back
to its original state with another bfd_preserve_restore call before
exiting with a bfd_error_file_ambiguously_recognized error.

It is also not correct to restore abfd->iostream unless the iovec
changes.  abfd->iostream is a FILE* when using cache_iovec, and if
the file has been closed and reopened the iostream may have changed.

* format.c (io_reinit): New function.
(bfd_reinit, bfd_preserve_restore): Use it.
bfd/format.c