|
@@ -43,7 +43,7 @@ struct sym_entry {
|
|
|
|
|
|
static struct sym_entry *table;
|
|
|
static unsigned int table_size, table_cnt;
|
|
|
-static unsigned long long _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext;
|
|
|
+static unsigned long long _text, _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext;
|
|
|
static int all_symbols = 0;
|
|
|
static char symbol_prefix_char = '\0';
|
|
|
|
|
@@ -91,7 +91,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
|
|
|
sym++;
|
|
|
|
|
|
/* Ignore most absolute/undefined (?) symbols. */
|
|
|
- if (strcmp(sym, "_stext") == 0)
|
|
|
+ if (strcmp(sym, "_text") == 0)
|
|
|
+ _text = s->addr;
|
|
|
+ else if (strcmp(sym, "_stext") == 0)
|
|
|
_stext = s->addr;
|
|
|
else if (strcmp(sym, "_etext") == 0)
|
|
|
_etext = s->addr;
|
|
@@ -265,9 +267,21 @@ static void write_src(void)
|
|
|
|
|
|
printf(".data\n");
|
|
|
|
|
|
+ /* Provide proper symbols relocatability by their '_text'
|
|
|
+ * relativeness. The symbol names cannot be used to construct
|
|
|
+ * normal symbol references as the list of symbols contains
|
|
|
+ * symbols that are declared static and are private to their
|
|
|
+ * .o files. This prevents .tmp_kallsyms.o or any other
|
|
|
+ * object from referencing them.
|
|
|
+ */
|
|
|
output_label("kallsyms_addresses");
|
|
|
for (i = 0; i < table_cnt; i++) {
|
|
|
- printf("\tPTR\t%#llx\n", table[i].addr);
|
|
|
+ if (toupper(table[i].sym[0]) != 'A') {
|
|
|
+ printf("\tPTR\t_text + %#llx\n",
|
|
|
+ table[i].addr - _text);
|
|
|
+ } else {
|
|
|
+ printf("\tPTR\t%#llx\n", table[i].addr);
|
|
|
+ }
|
|
|
}
|
|
|
printf("\n");
|
|
|
|