[PATCH 065/112] common: add PE/COFF loader

Ahmad Fatoum a.fatoum at pengutronix.de
Mon Mar 4 09:09:59 PST 2024


On 08.01.24 09:37, Sascha Hauer wrote:
> On Wed, Jan 03, 2024 at 07:12:25PM +0100, Ahmad Fatoum wrote:
>> EFI loader will need to parse and load PE executables. Add functions to
>> facilitate that. The API is inspired by the already existing ELF API.
>>
>> Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
>> ---
>>  common/Kconfig           |   3 +
>>  common/Makefile          |   1 +
>>  common/pe.c              | 377 +++++++++++++++++++++++++++++++
>>  include/asm-generic/pe.h |  56 +++++
>>  include/linux/pagemap.h  |   1 +
>>  include/linux/pe.h       | 468 +++++++++++++++++++++++++++++++++++++++
>>  include/pe.h             | 316 ++++++++++++++++++++++++++
>>  7 files changed, 1222 insertions(+)
>>  create mode 100644 common/pe.c
>>  create mode 100644 include/asm-generic/pe.h
>>  create mode 100644 include/linux/pe.h
>>  create mode 100644 include/pe.h
>>
>> +struct pe_image *pe_open(const char *filename)
>> +{
>> +	struct pe_image *pe;
>> +	size_t size;
>> +	void *bin;
>> +
>> +	bin = read_file(filename, &size);
>> +	if (!bin)
>> +		return NULL;
> 
> The static inline wrapper of this function indicates you should return
> an error pointer here.
> 
>> +
>> +	pe = pe_open_buf(bin, size);
>> +
>> +	//free(bin); // FIXME
> 
> Isn't this only a matter of adding free(pe->bin) to pe_close() and
> freeing it here in case pe_open_buf() fails?
> 
> 
>> diff --git a/include/asm-generic/pe.h b/include/asm-generic/pe.h
>> new file mode 100644
>> index 000000000000..a1df7471348e
>> --- /dev/null
>> +++ b/include/asm-generic/pe.h
>> @@ -0,0 +1,56 @@
>> +/* SPDX-License-Identifier: GPL-2.0+ */
>> +/*
>> + *  Portable Executable and Common Object Constants
>> + *
>> + *  Copyright (c) 2018 Heinrich Schuchardt
>> + *
>> + *  based on the "Microsoft Portable Executable and Common Object File Format
>> + *  Specification", revision 11, 2017-01-23
>> + */
>> +
>> +#ifndef _ASM_PE_H
>> +#define _ASM_PE_H
>> +
>> +/* Characteristics */
>> +#define IMAGE_FILE_RELOCS_STRIPPED		0x0001
>> +#define IMAGE_FILE_EXECUTABLE_IMAGE		0x0002
>> +#define IMAGE_FILE_LINE_NUMS_STRIPPED		0x0004
>> +#define IMAGE_FILE_LOCAL_SYMS_STRIPPED		0x0008
>> +#define IMAGE_FILE_AGGRESSIVE_WS_TRIM		0x0010
>> +#define IMAGE_FILE_LARGE_ADDRESS_AWARE		0x0020
>> +/* Reserved					0x0040 */
>> +#define IMAGE_FILE_BYTES_REVERSED_LO		0x0080
>> +#define IMAGE_FILE_32BIT_MACHINE		0x0100
>> +#define IMAGE_FILE_DEBUG_STRIPPED		0x0200
>> +#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP	0x0400
>> +#define IMAGE_FILE_NET_RUN_FROM_SWAP		0x0800
>> +#define IMAGE_FILE_SYSTEM			0x1000
>> +#define IMAGE_FILE_DLL				0x2000
>> +#define IMAGE_FILE_UP_SYSTEM_ONLY		0x4000
>> +#define IMAGE_FILE_BYTES_REVERSED_HI		0x8000
> 
> These defines are duplicated in include/linux/pe.h

Indeed. Some struct definitions are also duplicated between the U-Boot
header originating from Wine and <linux/pe.h>. I have removed the
duplication for v3.

Thanks,
Ahmad

> 
> Sascha
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |




More information about the barebox mailing list