]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Put all functions in kallsyms
authorAndrew Morton <akpm@digeo.com>
Sat, 12 Apr 2003 20:01:17 +0000 (13:01 -0700)
committerJames Bottomley <jejb@raven.il.steeleye.com>
Sat, 12 Apr 2003 20:01:17 +0000 (13:01 -0700)
From: Rusty Russell <rusty@rustcorp.com.au>

Introduce _sinittext and _einittext (cf. _stext and _etext), so kallsyms
includes __init functions.

TODO: Use huffman name compression and 16-bit offsets (see IDE
oopser patch)

20 files changed:
arch/alpha/vmlinux.lds.S
arch/arm/vmlinux-armo.lds.in
arch/arm/vmlinux-armv.lds.in
arch/i386/vmlinux.lds.S
arch/ia64/vmlinux.lds.S
arch/m68k/vmlinux-std.lds
arch/m68k/vmlinux-sun3.lds
arch/m68knommu/vmlinux.lds.S
arch/parisc/vmlinux.lds.S
arch/ppc/vmlinux.lds.S
arch/ppc64/vmlinux.lds.S
arch/s390/vmlinux.lds.S
arch/s390x/vmlinux.lds.S
arch/sparc/vmlinux.lds.S
arch/sparc64/vmlinux.lds.S
arch/v850/vmlinux.lds.S
arch/x86_64/vmlinux.lds.S
kernel/extable.c
kernel/kallsyms.c
scripts/kallsyms.c

index edcdefd20006bf1bda260cb442b8e453accb8eb1..863e60644e83c8553ea0b1e13ede49ddece54478 100644 (file)
@@ -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);
index 41afcce57495f403a19ca57a971f903c32540426..18e100b67d67c1991be949649853cf211a0b5545 100644 (file)
@@ -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 = .;
index bf8be1b119e14dc43a5b03e3a8dc1f5d274a168f..5155359e1a46a3c45e1997ed67af34ed86287189 100644 (file)
@@ -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 = .;
index f607523ff6147e818206b4cd356f366656019931..27016d7f597dc9dc7ad0d7da57970ec52440905d 100644 (file)
@@ -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 = .;
index 50ff363b6af7579fbae07b7e2cbf9404c0f89cf0..fc52b7b576266ed2a27b191d43bd1e9727b1d7d3 100644 (file)
@@ -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) }
index 4bf76f9f7d373abab35a725341bbe008b436b313..959c6ae414303741b9538769d30a80e0a6295429 100644 (file)
@@ -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 = .;
index 39a729d077f1df7e94ccce2249ac6a66f942a398..03ada554c074de7b424e7fbfada28f184ec1400e 100644 (file)
@@ -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 = .;
index 4f936da88b7f13b072da0c2d952e0939f9f758a3..fa6bd85c11d6ef4806b463887a87d400e6a46023 100644 (file)
@@ -282,7 +282,9 @@ SECTIONS {
        .init : {
                . = ALIGN(4096);
                __init_begin = .;
+               _sinittext = .;
                *(.init.text)
+               _einittext = .;
                *(.init.data)
                . = ALIGN(16);
                __setup_start = .;
index 348bc4972219a5daf8218950994c52de2ed2b56e..99db5cb1cc56efdf9e49bd267a745aed52ad4c13 100644 (file)
@@ -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 = .;
index e4cdd48f98be48b20ddfb657f1ad607a7bf086ed..557cb6c44921d92c6fa5d261a604d1818c40c472 100644 (file)
@@ -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 = .;
index e34d2b5de34297eb383dbf2dc5d70f4a3deb3231..f6429d5d13c023405af8f07ee179083310bece7d 100644 (file)
@@ -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 = .;
index 36d48e98973fcdef73d19b4922c80f94705b8289..6e36b3e552e422043c2e5633a85d54fb95e89781 100644 (file)
@@ -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 = .;
index 3a92829c17d366aa9654b0dcbbd0f55033288919..a6c179473e437d9b13b8175246c8968dcda4f538 100644 (file)
@@ -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 = .;
index db9e6d8a6a36627306eadf31e11d27c2bf8e2136..40fbec8537e29c89a349b7b6361c5674b1d0b2b9 100644 (file)
@@ -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);
index f3aa21d4634870f7b4acd4eecb14dcef250d6ed6..0c8919aa9f87245c5216ebb169dacf1cb95443df 100644 (file)
@@ -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 = .;
index 15c64a2ea846be417091ec359b7bf6874098a237..5b978afff11faa678d47b0b37838a4e99a96b77d 100644 (file)
 #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
index 6648607b233b773ebdaa5011e0bb21a72f6f3972..6bd383f57b879edc3278ea97b056284dbdbcc3b6 100644 (file)
@@ -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 = .;
index 5363e7f6f9e4aa8be6e67ff8db29d0a1f62ec3c5..d49099854024badb9c16be9e5c8d9c5d8d9cd5bf 100644 (file)
@@ -20,7 +20,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)
@@ -39,5 +39,9 @@ int kernel_text_address(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;
 }
index 822945bd923b38cba4c466bbf6c25a88d00737b6..3e9fbda3593cc30774b8ca3ba4ea77cc20fddd4f 100644 (file)
@@ -15,7 +15,22 @@ extern unsigned long kallsyms_num_syms __attribute__((weak));
 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 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;
 
@@ -52,6 +67,8 @@ const char *kallsyms_lookup(unsigned long addr,
                /* 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;
 
index 25ce910dcf757d9947dc0be40a221a2f1f460563..43c110fe782914cd6613a915d7a72c3f31aa620b 100644 (file)
@@ -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 *s)
 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;
        }
 }