Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ee6a8545a4cbc620625c7956c95aac513842156b
Commit:     ee6a8545a4cbc620625c7956c95aac513842156b
Parent:     118c0ace1b61433311ae4e067fdd32841baa7f91
Author:     Vivek Goyal <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 11 01:52:44 2007 +0100
Committer:  Andi Kleen <[EMAIL PROTECTED]>
CommitDate: Thu Jan 11 01:52:44 2007 +0100

    [PATCH] x86-64: Modpost whitelist reference to more symbols (pattern 3)
    
    o MODPOST generates warning on i386 if kernel is compiled with
      CONFIG_RELOCATABLE=y.
    
    WARNING: vmlinux - Section mismatch: reference to .init.text:__init_begin 
from .text between 'free_initmem' (at offset 0xc0114fd3) and 'do_test_wp_bit'
    WARNING: vmlinux - Section mismatch: reference to .init.text:_sinittext 
from .text between 'core_kernel_text' (at offset 0xc012aeae) and 
'kernel_text_address'
    WARNING: vmlinux - Section mismatch: reference to .init.text:_einittext 
from .text between 'core_kernel_text' (at offset 0xc012aeb7) and 
'kernel_text_address'
    WARNING: vmlinux - Section mismatch: reference to .init.text:_sinittext 
from .text between 'get_symbol_pos' (at offset 0xc0135776) and 'reset_iter'
    WARNING: vmlinux - Section mismatch: reference to .init.text:_einittext 
from .text between 'get_symbol_pos' (at offset 0xc013577d) and 'reset_iter'
    
    o These symbols (__init_begin, _sinittext, _einittext) belong to init
      section and generally represent a section boundary. These are special
      symbols in the sense that their size is zero and no memory is allocated
      for them in init section. Their addr and value are same. So even if
      we free the init section, it is ok to reference them.
    
    o Whitelist access to such select symbols in MODPOST.
    
    Signed-off-by: Vivek Goyal <[EMAIL PROTECTED]>
    Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
    Cc: "Eric W. Biederman" <[EMAIL PROTECTED]>
    Cc: Andi Kleen <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---
 scripts/mod/modpost.c |   26 ++++++++++++++++++++++++--
 1 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 82e019b..2aa4762 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -582,9 +582,19 @@ static int strrcmp(const char *s, const char *sub)
  *   tosec   = .init.text | .exit.text | .init.data
  *   fromsec = .data
  *   atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one
+ *
+ * Pattern 3:
+ *   Some symbols belong to init section but still it is ok to reference
+ *   these from non-init sections as these symbols don't have any memory
+ *   allocated for them and symbol address and value are same. So even
+ *   if init section is freed, its ok to reference those symbols.
+ *   For ex. symbols marking the init section boundaries.
+ *   This pattern is identified by
+ *   refsymname = __init_begin, _sinittext, _einittext
  **/
 static int secref_whitelist(const char *modname, const char *tosec,
-                           const char *fromsec, const char *atsym)
+                           const char *fromsec, const char *atsym,
+                           const char *refsymname)
 {
        int f1 = 1, f2 = 1;
        const char **s;
@@ -599,6 +609,13 @@ static int secref_whitelist(const char *modname, const 
char *tosec,
                NULL
        };
 
+       const char *pat3refsym[] = {
+               "__init_begin",
+               "_sinittext",
+               "_einittext",
+               NULL
+       };
+
        /* Check for pattern 1 */
        if (strcmp(tosec, ".init.data") != 0)
                f1 = 0;
@@ -629,6 +646,11 @@ static int secref_whitelist(const char *modname, const 
char *tosec,
                if ((strcmp(fromsec, ".pci_fixup") == 0) &&
                    (strcmp(tosec, ".init.text") == 0))
                return 1;
+
+               /* Check for pattern 3 */
+               for (s = pat3refsym; *s; s++)
+                       if (strcmp(refsymname, *s) == 0)
+                               return 1;
        }
        return 0;
 }
@@ -738,7 +760,7 @@ static void warn_sec_mismatch(const char *modname, const 
char *fromsec,
        /* check whitelist - we may ignore it */
        if (before &&
            secref_whitelist(modname, secname, fromsec,
-                            elf->strtab + before->st_name))
+                            elf->strtab + before->st_name, refsymname))
                return;
 
        if (before && after) {
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to