forked from mirrors/linux
		
	 5cf896fb6b
			
		
	
	
		5cf896fb6b
		
	
	
	
	
		
			
			RELR is a relocation packing format for relative relocations. The format is described in a generic-abi proposal: https://groups.google.com/d/topic/generic-abi/bX460iggiKg/discussion The LLD linker can be instructed to pack relocations in the RELR format by passing the flag --pack-dyn-relocs=relr. This patch adds a new config option, CONFIG_RELR. Enabling this option instructs the linker to pack vmlinux's relative relocations in the RELR format, and causes the kernel to apply the relocations at startup along with the RELA relocations. RELA relocations still need to be applied because the linker will emit RELA relative relocations if they are unrepresentable in the RELR format (i.e. address not a multiple of 2). Enabling CONFIG_RELR reduces the size of a defconfig kernel image with CONFIG_RANDOMIZE_BASE by 3.5MB/16% uncompressed, or 550KB/5% compressed (lz4). Signed-off-by: Peter Collingbourne <pcc@google.com> Tested-by: Nick Desaulniers <ndesaulniers@google.com> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Will Deacon <will@kernel.org>
		
			
				
	
	
		
			16 lines
		
	
	
	
		
			526 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			16 lines
		
	
	
	
		
			526 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh -eu
 | |
| # SPDX-License-Identifier: GPL-2.0
 | |
| 
 | |
| tmp_file=$(mktemp)
 | |
| trap "rm -f $tmp_file.o $tmp_file $tmp_file.bin" EXIT
 | |
| 
 | |
| cat << "END" | "$CC" -c -x c - -o $tmp_file.o >/dev/null 2>&1
 | |
| void *p = &p;
 | |
| END
 | |
| "$LD" $tmp_file.o -shared -Bsymbolic --pack-dyn-relocs=relr -o $tmp_file
 | |
| 
 | |
| # Despite printing an error message, GNU nm still exits with exit code 0 if it
 | |
| # sees a relr section. So we need to check that nothing is printed to stderr.
 | |
| test -z "$("$NM" $tmp_file 2>&1 >/dev/null)"
 | |
| 
 | |
| "$OBJCOPY" -O binary $tmp_file $tmp_file.bin
 |