coreboot-kgpe-d16/util/cbfstool
Jeremy Compostella 621ccf8a97 cbfstool: Skip relocation entries pointing to undefined symbol
The linker can make relocation entries of a symbol which has a value
of zero point to the undefined symbol entry.  It is permitted since
when the symbol value is zero as the documentation of the relocation
entry `r_info' field states:

"If the index is STN_UNDEF, the undefined symbol index, the relocation
 uses 0 as the symbol value."

The ELF binary does not really have any missing symbols.  It is an
optimization as the symbol points to the undefined symbol because its
value is zero.

A typical way to hit this cbfstool limitation is to define an empty
region using the REGION macro in the linker script.  Here is an
example if we assume `CONFIG_MY_REGION' is set to 0:

    .car.data {
            [...]
	    REGION(my_region, CONFIG_MY_REGION_SIZE)
	    [...]
    }

A region is defined as follow:

    #define REGION_SIZE(name) ((size_t)_##name##_size)

    #define DECLARE_REGION(name)	\
            extern u8 _##name[];	\
            extern u8 _e##name[];	\
            extern u8 _##name##_size[];

So the size of the region is actually the address of the
`_##name##_size' symbol.  Therefore, the `_my_region_size' symbol
address is zero and the linker can make the relocation entry of this
symbol point to the undefined symbol index.

In such a situation, cbfstool hits a segmentation fault when it
attempts to relocate the symbol in `parse_elf_to_xip_stage()'
function.  We resolves this issue by making cbfstool skips relocation
entries pointing to the undefined symbol similarly to the way it skips
relocation relative to absolute symbols.  A symbol which value is zero
can be considered an absolute symbol and therefore should not be
relocated.

Of course, we could argue that we could just prevent the declaration
of an empty region as illustrated in the following example:

    .car.data {
            [...]
	    #if CONFIG_MY_REGION_SIZE > 0
            REGION(my_region, CONFIG_MY_REGION_SIZE)
	    #endif
	    [...]
    }

However, this is not a satisfying solution because:

1. It requires to add unnecessary code in the linker script as an empty
   region is a valid declaration.  Such a workaround requires the code
   using it to mark the region symbols as weak symbols to handle the
   situation where the region is not defined.

2. There could be other situations which have yet to be uncovered which
   would lead the same cbfstool crash.

3. A binary with an empty region is a valid ELF file and cbfstool
   should not crash when it is asked to create an eXecute-In-Place stage
   out of it.

Change-Id: I2803fd3e96e7ff7a0b22d72d50bfbce7acaeb941
Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/77699
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
2023-10-20 14:32:20 +00:00
..
bpdt_formats util: Add SPDX license headers to Makefiles 2022-11-22 12:47:09 +00:00
console util/cbfstool: Wrap logging macros in do - while 2022-10-13 17:07:02 +00:00
flashmap util: Use common ARRAY_SIZE define 2023-05-22 19:24:27 +00:00
fpt_formats util: Add SPDX license headers to Makefiles 2022-11-22 12:47:09 +00:00
lz4 util: Add SPDX license headers to Makefiles 2022-11-22 12:47:09 +00:00
lzma
tests elogtool: add pytest for elogtool 2021-10-25 08:08:41 +00:00
.gitignore util/cbfstool/.gitignore: Add CSE tool executables 2021-11-29 18:44:34 +00:00
amdcompress.c util/cbfstool/amdcompress: fix argument requirement 2020-11-15 16:49:30 +00:00
cbfs-mkpayload.c util/cbfstool: Wrap logging macros in do - while 2022-10-13 17:07:02 +00:00
cbfs-mkstage.c cbfstool: Make add-stage support multiple loadable segments 2023-09-14 21:01:56 +00:00
cbfs-payload-linux.c linux_trampoline: Handle 64-bit framebuffer addresses 2023-08-03 17:55:01 +00:00
cbfs.h util/cbfstool: Check for metadata hash in verstage 2022-10-26 15:59:58 +00:00
cbfs_glue.h cbfs/vboot: Adapt to new vb2_digest API 2022-09-02 23:51:29 +00:00
cbfs_image.c cbfstool: Add comment to define stability rules for cbfstool print -k 2023-04-13 00:43:23 +00:00
cbfs_image.h util/cbfstool: Fix truncate command error handling and cbfs_image_from_buffer() 2022-08-03 23:24:49 +00:00
cbfs_sections.c
cbfs_sections.h cbfstool: Support CONFIG_CBFS_VERIFICATION and metadata hash anchor 2021-03-13 04:16:20 +00:00
cbfscomptool.c cbfstool: Use cbfs_serialized.h and standard vboot helpers 2020-12-03 00:00:33 +00:00
cbfstool.c cbfstool: Make add-stage support multiple ignore sections 2023-09-14 21:01:48 +00:00
coff.h util/cbfstool: Add support for ARM64 UefiPayload 2021-10-04 02:31:01 +00:00
common.c cbfstool: Fix possible memory leak 2022-11-09 00:26:30 +00:00
common.h util/cbfstool: Replace swab.h with commonlib/bsd/sysincludes.h 2022-01-10 21:32:34 +00:00
compress.c util/cbfstool: fix memory leak in compress.c 2022-11-02 21:40:25 +00:00
cse_fpt.c util/cse*: Add cse_helpers.{c,h} 2021-10-19 16:08:45 +00:00
cse_fpt.h util/cse*: Add cse_helpers.{c,h} 2021-10-19 16:08:45 +00:00
cse_helpers.c util/cse*: Add cse_helpers.{c,h} 2021-10-19 16:08:45 +00:00
cse_helpers.h util/cse*: Add cse_helpers.{c,h} 2021-10-19 16:08:45 +00:00
cse_serger.c util/cse_serger: Add command create-cse-region 2021-10-19 16:32:24 +00:00
cse_serger.h util/cse_serger: Replace cse_layout_regions with array of regions 2021-10-19 16:10:12 +00:00
default-x86.fmd soc/intel/alderlake/hsphy: Add possibility to cache HSPHY in flash 2023-06-23 08:59:50 +00:00
default.fmd
description.md
elf.h cbfstool: Add support for platform "fixups" when modifying bootblock 2021-03-13 04:17:35 +00:00
elfheaders.c treewide: Replace ALIGN(x, a) by ALIGN_UP(x, a) for clarity 2022-11-12 18:00:16 +00:00
elfparsing.h
elogtool.c util/cbfstool/eventlog: Use LocalTime or UTC timestamps 2023-03-02 13:05:35 +00:00
eventlog.c util/cbfstool: Add eventLog support for ELOG_TYPE_FW_SPLASH_SCREEN 2023-08-29 06:15:45 +00:00
eventlog.h util/cbfstool/eventlog: Use LocalTime or UTC timestamps 2023-03-02 13:05:35 +00:00
EXAMPLE
fdt.h
fit.c util/ifittool: Error out if microcodes do not fit the FIT table 2022-09-15 13:01:42 +00:00
fit.h util/ifittool: Add an option to set the FIT pointer a CBFS file 2021-03-19 11:22:55 +00:00
flashmap_tests.c
flashrom.c util: Drop flashrom -p host alias which equals to -p internal 2023-09-25 14:06:32 +00:00
flashrom.h treewide: Unify Google branding 2022-07-04 14:02:26 +00:00
fmap_from_fmd.c
fmap_from_fmd.h
fmaptool.c util/cbfstool/fmaptool: Generate list of terminal sections 2020-12-08 18:59:05 +00:00
fmd.c
fmd.h util/cbfstool/fmd: make flashmap_flags bitfield struct elements unsigned 2020-09-23 13:39:14 +00:00
fmd_parser.c_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_parser.h_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_parser.y
fmd_scanner.c_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_scanner.h_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_scanner.l
fv.h util/cbftool: Fix the bug in parsing Uefipayload with extended header 2021-09-02 06:07:08 +00:00
ifittool.c util/cbfstool: Add usage information about verbose output 2023-03-28 13:28:15 +00:00
ifwitool.c util: Use C99 flexible arrays 2023-08-01 12:51:25 +00:00
linux.h util/cbfstool: Qualify struct e820entry as packed 2023-04-16 14:04:32 +00:00
linux_trampoline.c linux_trampoline: Handle 64-bit framebuffer addresses 2023-08-03 17:55:01 +00:00
linux_trampoline.h util/cbfstool/linux_trampoline.h: Fix typo in comment 2021-06-04 12:35:14 +00:00
linux_trampoline.S linux_trampoline: Handle 64-bit framebuffer addresses 2023-08-03 17:55:01 +00:00
Makefile utils/cbfstool: Fix building with make test-tools 2022-02-27 18:29:24 +00:00
Makefile.inc util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
option.h
partitioned_file.c util/cbfstool: unbreak compilation on FreeBSD 2021-01-13 12:07:17 +00:00
partitioned_file.h
platform_fixups.c cbfs/vboot: Adapt to new vb2_digest API 2022-09-02 23:51:29 +00:00
ProcessorBind.h
rmodtool.c
rmodule.c cbfstool: Skip relocation entries pointing to undefined symbol 2023-10-20 14:32:20 +00:00
rmodule.h cbfstool: Make add-stage support multiple loadable segments 2023-09-14 21:01:56 +00:00
xdr.c