From cd92af1cab47ea34f52f5c3c005e8389ace7b374 Mon Sep 17 00:00:00 2001 From: Wentong Wu Date: Wed, 22 May 2019 16:50:58 +0800 Subject: [PATCH] linker: kobject-text.ld: avoid backwards location counter when kobject text area is greater than CONFIG_KOBJECT_TEXT_AREA, there will be location counter backwards, change it to assert to prompt configuring CONFIG_KOBJECT_TEXT_AREA larger. Fixes: #16307. Signed-off-by: Wentong Wu --- include/linker/kobject-text.ld | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/include/linker/kobject-text.ld b/include/linker/kobject-text.ld index f730c778030..1b1d91e7d6c 100644 --- a/include/linker/kobject-text.ld +++ b/include/linker/kobject-text.ld @@ -11,6 +11,7 @@ _kobject_text_area_start = .; *(".kobject_data.text*") _kobject_text_area_end = .; + _kobject_text_area_used = _kobject_text_area_end - _kobject_text_area_start; #ifndef LINKER_PASS2 #ifdef CONFIG_DYNAMIC_OBJECTS PROVIDE(z_object_gperf_find = .); @@ -20,6 +21,23 @@ PROVIDE(z_object_wordlist_foreach = .); #endif #endif - . += CONFIG_KOBJECT_TEXT_AREA - (_kobject_text_area_end - _kobject_text_area_start); + + /* In a valid build the MAX function will always evaluate to the + second argument below, but to give the user a good error message + when the area overflows we need to temporarily corrupt the + location counter, and then detect the overflow with an assertion + later on. */ + + . = MAX(., _kobject_text_area_start + CONFIG_KOBJECT_TEXT_AREA); + + ASSERT( + CONFIG_KOBJECT_TEXT_AREA >= _kobject_text_area_used, +"The configuration system has incorrectly set +'CONFIG_KOBJECT_TEXT_AREA' to +CONFIG_KOBJECT_TEXT_AREA, which is not big enough. You must +through Kconfig either disable 'CONFIG_USERSPACE', or set +'CONFIG_KOBJECT_TEXT_AREA' to a value larger than +CONFIG_KOBJECT_TEXT_AREA." + ); #endif /* CONFIG_USERSPACE */