printk() format %pS wrong symbol

Valentin Vidić vvidic at valentin-vidic.from.hr
Sat Jul 4 13:14:34 EDT 2020


On Sat, Jul 04, 2020 at 12:04:59PM -0400, William Tambe wrote:
> How or which function within that file translates an address to the string
> symbol+offset for the format %pS ?

%pS seems to end up in here:

static int __sprint_symbol(char *buffer, unsigned long address,
                           int symbol_offset, int add_offset)
{
        char *modname;
        const char *name;
        unsigned long offset, size;
        int len;

        address += symbol_offset;
        name = kallsyms_lookup(address, &size, &offset, &modname, buffer);
        if (!name)
                return sprintf(buffer, "0x%lx", address - symbol_offset);

        if (name != buffer)
                strcpy(buffer, name);
        len = strlen(buffer);
        offset -= symbol_offset;

        if (add_offset)
                len += sprintf(buffer + len, "+%#lx/%#lx", offset, size);

        if (modname)
                len += sprintf(buffer + len, " [%s]", modname);

        return len;
}

-- 
Valentin



More information about the Kernelnewbies mailing list