mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
symbols: don't omit "end" symbols upon mixed code / data aliases
At the example of _sinitext - that symbol has four aliases on x86:
__init_begin, __2M_init_start, __2M_rodata_end, and whatever the first
function in .init.text. With the GNU toolchain all of them are marked
'T' or 't'. With Clang/LLVM, however, some are marked 'r'. Since, to
save space, we want fake "end" symbols only for text, right now
want_symbol_end() has a respective check. That is getting in the way,
however, when the final of those symbols is 'r'. Remove the check and
instead zap the size for anything that is non-code.
Fixes: 6eede548df ('symbols: avoid emitting "end" symbols for data items')
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
1 parent
af3466ddd6
commit
af2dbe260f
1 file changed
+4
-1
+4
-1
@@ -165,6 +165,10 @@ static int read_symbol(FILE *in, struct sym_entry *s)
|
||||
else if (str[0] == '$')
|
||||
goto skip_tail;
|
||||
|
||||
/* We want fake "end" symbols only for text / code. */
|
||||
if (toupper((uint8_t)stype) != 'T')
|
||||
s->size = 0;
|
||||
|
||||
/* include the type field in the symbol name, so that it gets
|
||||
* compressed together */
|
||||
s->len = strlen(str) + 1;
|
||||
@@ -316,7 +320,6 @@ static int compare_name_orig(const void *p1, const void *p2)
|
||||
static bool want_symbol_end(unsigned int idx)
|
||||
{
|
||||
return table[idx].size &&
|
||||
toupper(table[idx].type) == 'T' &&
|
||||
(idx + 1 == table_cnt ||
|
||||
table[idx].addr + table[idx].size < table[idx + 1].addr);
|
||||
}
|
||||
|
||||