forked from mirrors/linux
		
	riscv: Use --emit-relocs in order to move .rela.dyn in init
To circumvent an issue where placing the relocations inside the init sections produces empty relocations, use --emit-relocs. But to avoid carrying those relocations in vmlinux, use an intermediate vmlinux.relocs file which is a copy of vmlinux *before* stripping its relocations. Suggested-by: Björn Töpel <bjorn@kernel.org> Suggested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com> Link: https://lore.kernel.org/r/20230329045329.64565-7-alexghiti@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
		
							parent
							
								
									c2dea0bc53
								
							
						
					
					
						commit
						559d1e45a1
					
				
					 3 changed files with 21 additions and 1 deletions
				
			
		|  | @ -8,7 +8,7 @@ | ||||||
| 
 | 
 | ||||||
| OBJCOPYFLAGS    := -O binary | OBJCOPYFLAGS    := -O binary | ||||||
| ifeq ($(CONFIG_RELOCATABLE),y) | ifeq ($(CONFIG_RELOCATABLE),y) | ||||||
| 	LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro | 	LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro --emit-relocs | ||||||
| 	KBUILD_CFLAGS += -fPIE | 	KBUILD_CFLAGS += -fPIE | ||||||
| endif | endif | ||||||
| ifeq ($(CONFIG_DYNAMIC_FTRACE),y) | ifeq ($(CONFIG_DYNAMIC_FTRACE),y) | ||||||
|  |  | ||||||
|  | @ -15,12 +15,25 @@ quiet_cmd_relocs_check = CHKREL  $@ | ||||||
| cmd_relocs_check = 							\ | cmd_relocs_check = 							\ | ||||||
| 	$(CONFIG_SHELL) $(srctree)/arch/riscv/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@" | 	$(CONFIG_SHELL) $(srctree)/arch/riscv/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@" | ||||||
| 
 | 
 | ||||||
|  | ifdef CONFIG_RELOCATABLE | ||||||
|  | quiet_cmd_cp_vmlinux_relocs = CPREL   vmlinux.relocs | ||||||
|  | cmd_cp_vmlinux_relocs = cp vmlinux vmlinux.relocs | ||||||
|  | 
 | ||||||
|  | quiet_cmd_relocs_strip = STRIPREL $@ | ||||||
|  | cmd_relocs_strip = $(OBJCOPY)   --remove-section='.rel.*'       \ | ||||||
|  |                                 --remove-section='.rel__*'      \ | ||||||
|  |                                 --remove-section='.rela.*'      \ | ||||||
|  |                                 --remove-section='.rela__*' $@ | ||||||
|  | endif | ||||||
|  | 
 | ||||||
| # `@true` prevents complaint when there is nothing to be done | # `@true` prevents complaint when there is nothing to be done | ||||||
| 
 | 
 | ||||||
| vmlinux: FORCE | vmlinux: FORCE | ||||||
| 	@true | 	@true | ||||||
| ifdef CONFIG_RELOCATABLE | ifdef CONFIG_RELOCATABLE | ||||||
| 	$(call if_changed,relocs_check) | 	$(call if_changed,relocs_check) | ||||||
|  | 	$(call if_changed,cp_vmlinux_relocs) | ||||||
|  | 	$(call if_changed,relocs_strip) | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| %.ko: FORCE | %.ko: FORCE | ||||||
|  |  | ||||||
|  | @ -33,7 +33,14 @@ $(obj)/xipImage: vmlinux FORCE | ||||||
| 
 | 
 | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
|  | ifdef CONFIG_RELOCATABLE | ||||||
|  | vmlinux.relocs: vmlinux | ||||||
|  | 	@ (! [ -f vmlinux.relocs ] && echo "vmlinux.relocs can't be found, please remove vmlinux and try again") || true | ||||||
|  | 
 | ||||||
|  | $(obj)/Image: vmlinux.relocs FORCE | ||||||
|  | else | ||||||
| $(obj)/Image: vmlinux FORCE | $(obj)/Image: vmlinux FORCE | ||||||
|  | endif | ||||||
| 	$(call if_changed,objcopy) | 	$(call if_changed,objcopy) | ||||||
| 
 | 
 | ||||||
| $(obj)/Image.gz: $(obj)/Image FORCE | $(obj)/Image.gz: $(obj)/Image FORCE | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Alexandre Ghiti
						Alexandre Ghiti