lkml.org 
[lkml]   [2003]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRe: [PATCH] Put all functions in kallsyms
Date
In message <Pine.LNX.4.44.0303311736440.10623-100000@chaos.physics.uiowa.edu> y
ou write:
> On Mon, 31 Mar 2003, Rusty Russell wrote:
>
> > Simple, untested patch. Any objections?
>
> No objection, but you need to adapt the test in
> kernel/kallsyms.c:
>
> if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) {
>
> and in kernel/extable.c:
>
> if (addr >= (unsigned long)_stext &&
> addr <= (unsigned long)_etext)
>
> Otherwise, you'd just add bloat with no gain at all ;)

Ick. Yes, the extable.c one is the killer. OK, let's do it the other
way.

How's this? (Actually tested this time).
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

Name: Include All Functions in kallsyms
Author: Rusty Russell
Status: Tested on 2.5.66-bk6

D: Introduce _sinittext and _einittext (cf. _stext and _etext), so kallsyms
D: includes __init functions.
D:
D: TODO: Use huffman name compression and 16-bit offsets (see IDE
D: oopser patch)

diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/alpha/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/alpha/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/alpha/vmlinux.lds.S 2003-03-18 12:21:30.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/alpha/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -32,7 +32,11 @@ SECTIONS
/* 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);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/arm/vmlinux-armo.lds.in working-2.5.66-bk6-kallsyms-all/arch/arm/vmlinux-armo.lds.in
--- linux-2.5.66-bk6/arch/arm/vmlinux-armo.lds.in 2003-03-18 12:21:30.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/arm/vmlinux-armo.lds.in 2003-04-01 12:30:50.000000000 +1000
@@ -14,7 +14,9 @@ SECTIONS
.init : { /* Init code and data */
_stext = .;
__init_begin = .;
+ _sinittext = .;
*(.init.text)
+ _einittext = .;
__proc_info_begin = .;
*(.proc.info)
__proc_info_end = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/arm/vmlinux-armv.lds.in working-2.5.66-bk6-kallsyms-all/arch/arm/vmlinux-armv.lds.in
--- linux-2.5.66-bk6/arch/arm/vmlinux-armv.lds.in 2003-03-18 12:21:30.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/arm/vmlinux-armv.lds.in 2003-04-01 12:30:50.000000000 +1000
@@ -18,7 +18,9 @@ SECTIONS
.init : { /* Init code and data */
_stext = .;
__init_begin = .;
+ _sinittext = .;
*(.init.text)
+ _einittext = .;
__proc_info_begin = .;
*(.proc.info)
__proc_info_end = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/i386/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/i386/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/i386/vmlinux.lds.S 2003-03-18 12:21:31.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/i386/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -54,7 +54,11 @@ SECTIONS
/* 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 = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/ia64/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/ia64/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/ia64/vmlinux.lds.S 2003-03-18 12:21:31.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/ia64/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -96,7 +96,11 @@ SECTIONS
. = 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) }
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/m68k/vmlinux-std.lds working-2.5.66-bk6-kallsyms-all/arch/m68k/vmlinux-std.lds
--- linux-2.5.66-bk6/arch/m68k/vmlinux-std.lds 2003-03-18 12:21:31.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/m68k/vmlinux-std.lds 2003-04-01 12:30:50.000000000 +1000
@@ -40,7 +40,11 @@ SECTIONS
/* 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 = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/m68k/vmlinux-sun3.lds working-2.5.66-bk6-kallsyms-all/arch/m68k/vmlinux-sun3.lds
--- linux-2.5.66-bk6/arch/m68k/vmlinux-sun3.lds 2003-03-25 12:16:57.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/m68k/vmlinux-sun3.lds 2003-04-01 12:30:50.000000000 +1000
@@ -34,7 +34,11 @@ SECTIONS
/* 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 = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/m68knommu/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/m68knommu/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/m68knommu/vmlinux.lds.S 2003-03-18 12:21:31.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/m68knommu/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -282,7 +282,9 @@ SECTIONS {
.init : {
. = ALIGN(4096);
__init_begin = .;
+ _sinittext = .;
*(.init.text)
+ _einittext = .;
*(.init.data)
. = ALIGN(16);
__setup_start = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/parisc/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/parisc/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/parisc/vmlinux.lds.S 2003-03-18 12:21:32.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/parisc/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -53,7 +53,11 @@ SECTIONS

. = ALIGN(16384);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/ppc/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/ppc/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/ppc/vmlinux.lds.S 2003-03-18 12:21:32.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/ppc/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -78,7 +78,11 @@ SECTIONS

. = ALIGN(4096);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : {
*(.init.data);
__vtop_table_begin = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/ppc64/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/ppc64/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/ppc64/vmlinux.lds.S 2003-03-18 12:21:32.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/ppc64/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -77,7 +77,11 @@ SECTIONS
/* 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 = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/s390/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/s390/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/s390/vmlinux.lds.S 2003-03-18 12:21:32.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/s390/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -58,7 +58,11 @@ SECTIONS
/* 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 = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/s390x/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/s390x/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/s390x/vmlinux.lds.S 2003-03-18 12:21:32.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/s390x/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -58,7 +58,11 @@ SECTIONS
/* 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 = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/sparc/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/sparc/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/sparc/vmlinux.lds.S 2003-03-18 12:21:33.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/sparc/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -34,7 +34,11 @@ SECTIONS

. = ALIGN(4096);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
__init_text_end = .;
.init.data : { *(.init.data) }
. = ALIGN(16);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/sparc64/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/sparc64/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/sparc64/vmlinux.lds.S 2003-03-18 12:21:33.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/sparc64/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -41,7 +41,11 @@ SECTIONS

. = ALIGN(8192);
__init_begin = .;
- .init.text : { *(.init.text) }
+ .init.text : {
+ _sinittext = .;
+ *(.init.text)
+ _einittext = .;
+ }
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/v850/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/v850/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/v850/vmlinux.lds.S 2003-02-25 10:10:52.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/v850/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -105,7 +105,9 @@
#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) \
@@ -125,7 +127,9 @@
/* 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
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/arch/x86_64/vmlinux.lds.S working-2.5.66-bk6-kallsyms-all/arch/x86_64/vmlinux.lds.S
--- linux-2.5.66-bk6/arch/x86_64/vmlinux.lds.S 2003-03-18 12:21:33.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/arch/x86_64/vmlinux.lds.S 2003-04-01 12:30:50.000000000 +1000
@@ -78,7 +78,11 @@ SECTIONS

. = 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 = .;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/kernel/extable.c working-2.5.66-bk6-kallsyms-all/kernel/extable.c
--- linux-2.5.66-bk6/kernel/extable.c 2003-02-07 19:20:44.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/kernel/extable.c 2003-04-01 12:30:50.000000000 +1000
@@ -19,7 +19,7 @@

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)
@@ -38,5 +38,9 @@ int kernel_text_address(unsigned long ad
addr <= (unsigned long)_etext)
return 1;

+ if (addr >= (unsigned long)_sinittext &&
+ addr <= (unsigned long)_einittext)
+ return 1;
+
return module_text_address(addr);
}
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/kernel/kallsyms.c working-2.5.66-bk6-kallsyms-all/kernel/kallsyms.c
--- linux-2.5.66-bk6/kernel/kallsyms.c 2003-02-07 19:22:28.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/kernel/kallsyms.c 2003-04-01 12:30:50.000000000 +1000
@@ -15,7 +15,22 @@ extern unsigned long kallsyms_num_syms _
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,
@@ -31,7 +46,7 @@ const char *kallsyms_lookup(unsigned lon
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;

@@ -52,6 +67,8 @@ const char *kallsyms_lookup(unsigned lon
/* 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;

diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.66-bk6/scripts/kallsyms.c working-2.5.66-bk6-kallsyms-all/scripts/kallsyms.c
--- linux-2.5.66-bk6/scripts/kallsyms.c 2003-02-07 19:22:29.000000000 +1100
+++ working-2.5.66-bk6-kallsyms-all/scripts/kallsyms.c 2003-04-01 12:30:50.000000000 +1000
@@ -21,7 +21,7 @@ struct sym_entry {

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)
@@ -51,10 +51,8 @@ read_symbol(FILE *in, struct sym_entry *
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."))
@@ -85,6 +83,10 @@ read_map(FILE *in)
_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;
}
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:34    [W:0.036 / U:0.676 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site