lkml.org 
[lkml]   [2006]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 8/33] kallsyms.c: Generate relocatable symbols.
    Date
    Print the addresses of non-absolute symbols relative to _text
    so that ld will generate relocations. Allowing a relocatable
    kernel to relocate them. We can't actually use the symbol names
    because kallsyms includes static symbols that are not exported
    from their object files.

    Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
    ---
    scripts/kallsyms.c | 20 +++++++++++++++++---
    1 files changed, 17 insertions(+), 3 deletions(-)

    diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
    index 22d281c..4c1ad0a 100644
    --- a/scripts/kallsyms.c
    +++ b/scripts/kallsyms.c
    @@ -43,7 +43,7 @@ struct sym_entry {

    static struct sym_entry *table;
    static unsigned int table_size, table_cnt;
    -static unsigned long long _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext;
    +static unsigned long long _text, _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext;
    static int all_symbols = 0;
    static char symbol_prefix_char = '\0';

    @@ -91,7 +91,9 @@ static int read_symbol(FILE *in, struct
    sym++;

    /* Ignore most absolute/undefined (?) symbols. */
    - if (strcmp(sym, "_stext") == 0)
    + if (strcmp(sym, "_text") == 0)
    + _text = s->addr;
    + else if (strcmp(sym, "_stext") == 0)
    _stext = s->addr;
    else if (strcmp(sym, "_etext") == 0)
    _etext = s->addr;
    @@ -265,9 +267,21 @@ static void write_src(void)

    printf(".data\n");

    + /* Provide proper symbols relocatability by their '_text'
    + * relativeness. The symbol names cannot be used to construct
    + * normal symbol references as the list of symbols contains
    + * symbols that are declared static and are private to their
    + * .o files. This prevents .tmp_kallsyms.o or any other
    + * object from referencing them.
    + */
    output_label("kallsyms_addresses");
    for (i = 0; i < table_cnt; i++) {
    - printf("\tPTR\t%#llx\n", table[i].addr);
    + if (toupper(table[i].sym[0]) != 'A') {
    + printf("\tPTR\t_text + %#llx\n",
    + table[i].addr - _text);
    + } else {
    + printf("\tPTR\t%#llx\n", table[i].addr);
    + }
    }
    printf("\n");

    --
    1.4.2.rc2.g5209e
    -
    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: 2006-08-01 13:15    [W:0.036 / U:33.448 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site