/* Will be freed after init */
. = ALIGN(8192); /* Init code and data */
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
.init : { /* Init code and data */
_stext = .;
__init_begin = .;
+ _sinittext = .;
*(.init.text)
+ _einittext = .;
__proc_info_begin = .;
*(.proc.info)
__proc_info_end = .;
.init : { /* Init code and data */
_stext = .;
__init_begin = .;
+ _sinittext = .;
*(.init.text)
+ _einittext = .;
__proc_info_begin = .;
*(.proc.info)
__proc_info_end = .;
/* will be freed after init */
. = ALIGN(4096); /* Init code and data */
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
. = ALIGN(PAGE_SIZE);
__init_begin = .;
.init.text : AT(ADDR(.init.text) - PAGE_OFFSET)
- { *(.init.text) }
+ {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : AT(ADDR(.init.data) - PAGE_OFFSET)
{ *(.init.data) }
/* will be freed after init */
. = ALIGN(4096); /* Init code and data */
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
/* will be freed after init */
. = ALIGN(8192); /* Init code and data */
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
.init : {
. = ALIGN(4096);
__init_begin = .;
+ _sinittext = .;
*(.init.text)
+ _einittext = .;
*(.init.data)
. = ALIGN(16);
__setup_start = .;
. = ALIGN(16384);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
. = ALIGN(4096);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : {
*(.init.data);
__vtop_table_begin = .;
/* will be freed after init */
. = ALIGN(4096);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
/* will be freed after init */
. = ALIGN(4096); /* Init code and data */
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(256);
__setup_start = .;
/* will be freed after init */
. = ALIGN(4096); /* Init code and data */
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(256);
__setup_start = .;
. = ALIGN(4096);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
__init_text_end = .;
.init.data : { *(.init.data) }
. = ALIGN(16);
. = ALIGN(8192);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
#define RAMK_INIT_CONTENTS_NO_END \
. = ALIGN (4096) ; \
__init_start = . ; \
+ _sinittext = .; \
*(.init.text) /* 2.5 convention */ \
+ _einittext = .; \
*(.init.data) \
*(.text.init) /* 2.4 convention */ \
*(.data.init) \
/* The contents of `init' section for a ROM-resident kernel which
should go into ROM. */
#define ROMK_INIT_ROM_CONTENTS \
+ _sinittext = .; \
*(.init.text) /* 2.5 convention */ \
+ _einittext = .; \
*(.text.init) /* 2.4 convention */ \
INITCALL_CONTENTS \
INITRAMFS_CONTENTS
. = ALIGN(4096); /* Init code and data */
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
extern const struct exception_table_entry __start___ex_table[];
extern const struct exception_table_entry __stop___ex_table[];
-extern char _stext[], _etext[];
+extern char _stext[], _etext[], _sinittext[], _einittext[];
/* Given an address, look for it in the exception tables. */
const struct exception_table_entry *search_exception_tables(unsigned long addr)
addr <= (unsigned long)_etext)
return 1;
+ if (addr >= (unsigned long)_sinittext &&
+ addr <= (unsigned long)_einittext)
+ return 1;
+
return module_text_address(addr) != NULL;
}
extern char kallsyms_names[] __attribute__((weak));
/* Defined by the linker script. */
-extern char _stext[], _etext[];
+extern char _stext[], _etext[], _sinittext[], _einittext[];
+
+static inline int is_kernel_inittext(unsigned long addr)
+{
+ if (addr >= (unsigned long)_sinittext
+ && addr <= (unsigned long)_einittext)
+ return 1;
+ return 0;
+}
+
+static inline int is_kernel_text(unsigned long addr)
+{
+ if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext)
+ return 1;
+ return 0;
+}
/* Lookup an address. modname is set to NULL if it's in the kernel. */
const char *kallsyms_lookup(unsigned long addr,
namebuf[127] = 0;
namebuf[0] = 0;
- if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) {
+ if (is_kernel_text(addr) || is_kernel_inittext(addr)) {
unsigned long symbol_end;
char *name = kallsyms_names;
/* Base symbol size on next symbol. */
if (best + 1 < kallsyms_num_syms)
symbol_end = kallsyms_addresses[best + 1];
+ else if (is_kernel_inittext(addr))
+ symbol_end = (unsigned long)_einittext;
else
symbol_end = (unsigned long)_etext;
static struct sym_entry *table;
static int size, cnt;
-static unsigned long long _stext, _etext;
+static unsigned long long _stext, _etext, _sinittext, _einittext;
static void
usage(void)
static int
symbol_valid(struct sym_entry *s)
{
- if (s->addr < _stext)
- return 0;
-
- if (s->addr > _etext)
+ if ((s->addr < _stext || s->addr > _etext)
+ && (s->addr < _sinittext || s->addr > _einittext))
return 0;
if (strstr(s->sym, "_compiled."))
_stext = table[i].addr;
if (strcmp(table[i].sym, "_etext") == 0)
_etext = table[i].addr;
+ if (strcmp(table[i].sym, "_sinittext") == 0)
+ _sinittext = table[i].addr;
+ if (strcmp(table[i].sym, "_einittext") == 0)
+ _einittext = table[i].addr;
}
}