forked from mirrors/linux
		
	kbuild: remove PROVIDE() for kallsyms symbols
This reimplements commit 951bcae6c5 ("kallsyms: Avoid weak references
for kallsyms symbols") because I am not a big fan of PROVIDE().
As an alternative solution, this commit prepends one more kallsyms step.
    KSYMS   .tmp_vmlinux.kallsyms0.S          # added
    AS      .tmp_vmlinux.kallsyms0.o          # added
    LD      .tmp_vmlinux.btf
    BTF     .btf.vmlinux.bin.o
    LD      .tmp_vmlinux.kallsyms1
    NM      .tmp_vmlinux.kallsyms1.syms
    KSYMS   .tmp_vmlinux.kallsyms1.S
    AS      .tmp_vmlinux.kallsyms1.o
    LD      .tmp_vmlinux.kallsyms2
    NM      .tmp_vmlinux.kallsyms2.syms
    KSYMS   .tmp_vmlinux.kallsyms2.S
    AS      .tmp_vmlinux.kallsyms2.o
    LD      vmlinux
Step 0 takes /dev/null as input, and generates .tmp_vmlinux.kallsyms0.o,
which has a valid kallsyms format with the empty symbol list, and can be
linked to vmlinux. Since it is really small, the added compile-time cost
is negligible.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
			
			
This commit is contained in:
		
							parent
							
								
									ddf4132983
								
							
						
					
					
						commit
						c442db3f49
					
				
					 4 changed files with 7 additions and 32 deletions
				
			
		|  | @ -451,30 +451,11 @@ | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * Some symbol definitions will not exist yet during the first pass of the |  | ||||||
|  * link, but are guaranteed to exist in the final link. Provide preliminary |  | ||||||
|  * definitions that will be superseded in the final link to avoid having to |  | ||||||
|  * rely on weak external linkage, which requires a GOT when used in position |  | ||||||
|  * independent code. |  | ||||||
|  */ |  | ||||||
| #define PRELIMINARY_SYMBOL_DEFINITIONS					\ |  | ||||||
| 	PROVIDE(kallsyms_addresses = .);				\ |  | ||||||
| 	PROVIDE(kallsyms_offsets = .);					\ |  | ||||||
| 	PROVIDE(kallsyms_names = .);					\ |  | ||||||
| 	PROVIDE(kallsyms_num_syms = .);					\ |  | ||||||
| 	PROVIDE(kallsyms_relative_base = .);				\ |  | ||||||
| 	PROVIDE(kallsyms_token_table = .);				\ |  | ||||||
| 	PROVIDE(kallsyms_token_index = .);				\ |  | ||||||
| 	PROVIDE(kallsyms_markers = .);					\ |  | ||||||
| 	PROVIDE(kallsyms_seqs_of_names = .); |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Read only Data |  * Read only Data | ||||||
|  */ |  */ | ||||||
| #define RO_DATA(align)							\ | #define RO_DATA(align)							\ | ||||||
| 	. = ALIGN((align));						\ | 	. = ALIGN((align));						\ | ||||||
| 	PRELIMINARY_SYMBOL_DEFINITIONS					\ |  | ||||||
| 	.rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {		\ | 	.rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {		\ | ||||||
| 		__start_rodata = .;					\ | 		__start_rodata = .;					\ | ||||||
| 		*(.rodata) *(.rodata.*)					\ | 		*(.rodata) *(.rodata.*)					\ | ||||||
|  |  | ||||||
|  | @ -4,11 +4,6 @@ | ||||||
| 
 | 
 | ||||||
| #include <linux/types.h> | #include <linux/types.h> | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * These will be re-linked against their real values during the second link |  | ||||||
|  * stage. Preliminary values must be provided in the linker script using the |  | ||||||
|  * PROVIDE() directive so that the first link stage can complete successfully. |  | ||||||
|  */ |  | ||||||
| extern const unsigned long kallsyms_addresses[]; | extern const unsigned long kallsyms_addresses[]; | ||||||
| extern const int kallsyms_offsets[]; | extern const int kallsyms_offsets[]; | ||||||
| extern const u8 kallsyms_names[]; | extern const u8 kallsyms_names[]; | ||||||
|  |  | ||||||
|  | @ -259,12 +259,6 @@ static void shrink_table(void) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	table_cnt = pos; | 	table_cnt = pos; | ||||||
| 
 |  | ||||||
| 	/* When valid symbol is not registered, exit to error */ |  | ||||||
| 	if (!table_cnt) { |  | ||||||
| 		fprintf(stderr, "No valid symbol.\n"); |  | ||||||
| 		exit(1); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void read_map(const char *in) | static void read_map(const char *in) | ||||||
|  |  | ||||||
|  | @ -227,6 +227,10 @@ btf_vmlinux_bin_o= | ||||||
| kallsymso= | kallsymso= | ||||||
| strip_debug= | strip_debug= | ||||||
| 
 | 
 | ||||||
|  | if is_enabled CONFIG_KALLSYMS; then | ||||||
|  | 	kallsyms /dev/null .tmp_vmlinux.kallsyms0 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
| if is_enabled CONFIG_DEBUG_INFO_BTF; then | if is_enabled CONFIG_DEBUG_INFO_BTF; then | ||||||
| 	if ! gen_btf .tmp_vmlinux.btf .btf.vmlinux.bin.o ; then | 	if ! gen_btf .tmp_vmlinux.btf .btf.vmlinux.bin.o ; then | ||||||
| 		echo >&2 "Failed to generate BTF for vmlinux" | 		echo >&2 "Failed to generate BTF for vmlinux" | ||||||
|  | @ -239,9 +243,10 @@ if is_enabled CONFIG_KALLSYMS; then | ||||||
| 
 | 
 | ||||||
| 	# kallsyms support | 	# kallsyms support | ||||||
| 	# Generate section listing all symbols and add it into vmlinux | 	# Generate section listing all symbols and add it into vmlinux | ||||||
| 	# It's a three step process: | 	# It's a four step process: | ||||||
|  | 	# 0)  Generate a dummy __kallsyms with empty symbol list. | ||||||
| 	# 1)  Link .tmp_vmlinux.kallsyms1 so it has all symbols and sections, | 	# 1)  Link .tmp_vmlinux.kallsyms1 so it has all symbols and sections, | ||||||
| 	#     but __kallsyms is empty. | 	#     with a dummy __kallsyms. | ||||||
| 	#     Running kallsyms on that gives us .tmp_kallsyms1.o with | 	#     Running kallsyms on that gives us .tmp_kallsyms1.o with | ||||||
| 	#     the right size | 	#     the right size | ||||||
| 	# 2)  Link .tmp_vmlinux.kallsyms2 so it now has a __kallsyms section of | 	# 2)  Link .tmp_vmlinux.kallsyms2 so it now has a __kallsyms section of | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Masahiro Yamada
						Masahiro Yamada