Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
[sfrench/cifs-2.6.git] / kernel / kallsyms.c
index fed54418626c10727662a79d0e505ee302e0bcbf..2fc25810509e187441297e4d2b8873e3d2db8ea3 100644 (file)
 
 /* These will be re-linked against their real values during the second link stage */
 extern const unsigned long kallsyms_addresses[] __attribute__((weak));
-extern const unsigned long kallsyms_num_syms __attribute__((weak));
 extern const u8 kallsyms_names[] __attribute__((weak));
 
+/* tell the compiler that the count isn't in the small data section if the arch
+ * has one (eg: FRV)
+ */
+extern const unsigned long kallsyms_num_syms
+__attribute__((weak, section(".rodata")));
+
 extern const u8 kallsyms_token_table[] __attribute__((weak));
 extern const u16 kallsyms_token_index[] __attribute__((weak));
 
@@ -152,7 +157,7 @@ static unsigned int get_symbol_offset(unsigned long pos)
 /* Lookup the address for this symbol. Returns 0 if not found. */
 unsigned long kallsyms_lookup_name(const char *name)
 {
-       char namebuf[KSYM_NAME_LEN+1];
+       char namebuf[KSYM_NAME_LEN];
        unsigned long i;
        unsigned int off;
 
@@ -248,7 +253,7 @@ const char *kallsyms_lookup(unsigned long addr,
 {
        const char *msym;
 
-       namebuf[KSYM_NAME_LEN] = 0;
+       namebuf[KSYM_NAME_LEN - 1] = 0;
        namebuf[0] = 0;
 
        if (is_ksym_addr(addr)) {
@@ -265,7 +270,7 @@ const char *kallsyms_lookup(unsigned long addr,
        /* see if it's in a module */
        msym = module_address_lookup(addr, symbolsize, offset, modname);
        if (msym)
-               return strncpy(namebuf, msym, KSYM_NAME_LEN);
+               return strncpy(namebuf, msym, KSYM_NAME_LEN - 1);
 
        return NULL;
 }
@@ -273,7 +278,7 @@ const char *kallsyms_lookup(unsigned long addr,
 int lookup_symbol_name(unsigned long addr, char *symname)
 {
        symname[0] = '\0';
-       symname[KSYM_NAME_LEN] = '\0';
+       symname[KSYM_NAME_LEN - 1] = '\0';
 
        if (is_ksym_addr(addr)) {
                unsigned long pos;
@@ -291,7 +296,7 @@ int lookup_symbol_attrs(unsigned long addr, unsigned long *size,
                        unsigned long *offset, char *modname, char *name)
 {
        name[0] = '\0';
-       name[KSYM_NAME_LEN] = '\0';
+       name[KSYM_NAME_LEN - 1] = '\0';
 
        if (is_ksym_addr(addr)) {
                unsigned long pos;
@@ -312,18 +317,17 @@ int sprint_symbol(char *buffer, unsigned long address)
        char *modname;
        const char *name;
        unsigned long offset, size;
-       char namebuf[KSYM_NAME_LEN+1];
+       char namebuf[KSYM_NAME_LEN];
 
        name = kallsyms_lookup(address, &size, &offset, &modname, namebuf);
        if (!name)
                return sprintf(buffer, "0x%lx", address);
-       else {
-               if (modname)
-                       return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
+
+       if (modname)
+               return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
                                size, modname);
-               else
-                       return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size);
-       }
+       else
+               return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size);
 }
 
 /* Look up a kernel symbol and print it to the kernel messages. */
@@ -343,8 +347,8 @@ struct kallsym_iter
        unsigned long value;
        unsigned int nameoff; /* If iterating in core kernel symbols */
        char type;
-       char name[KSYM_NAME_LEN+1];
-       char module_name[MODULE_NAME_LEN + 1];
+       char name[KSYM_NAME_LEN];
+       char module_name[MODULE_NAME_LEN];
        int exported;
 };