lkml.org 
[lkml]   [2009]   [Nov]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH 05/10] kbuild: sort the list of symbols exported by the kernel (__ksymtab)
    On Wed, Nov 4, 2009 at 05:00, Alan Jenkins wrote:
    > Rusty Russell wrote:
    >> On Tue, 3 Nov 2009 08:36:17 pm Alan Jenkins wrote:
    >>> +/*
    >>> + * We use CPP macros since they are more familiar than assembly macros.
    >>> + * Note that CPP macros eat newlines, so each statement must be
    >>> terminated
    >>> + * by a semicolon.
    >>> + */
    >>> +
    >>> +#ifdef CONFIG_HAVE_SYMBOL_PREFIX
    >>> +#define __SYM(sym) _##sym
    >>> +#else
    >>> +#define __SYM(sym) sym
    >>> +#endif
    >>>
    >>
    >> Ideally, you would used MODULE_SYMBOL_PREFIX here, but of course it's a
    >> string.  I don't think Kconfig can do arbitrary identifiers, so we can't
    >> make CONFIG_SYMBOL_PREFIX empty or _.
    >>
    >> Perhaps clarify it to a bool CONFIG_HAVE_MODULE_UNDERSCORE_PREFIX then,
    >> since that's what you're assuming here?
    >>
    >> Thanks,
    >> Rusty.
    >
    > I made the same assumption in patch 4.  The arch defines
    > CONFIG_HAVE_SYMBOL_PREFIX, which then causes init/Kconfig to define
    > CONFIG_SYMBOL_PREFIX="_".
    >
    > Mike suggested that I hack kbuild instead, to do something like
    >
    > unquote = ...
    > AFLAGS_.tmp_export-asm.o += -DSYMBOL_PREFIX=$(unquote CONFIG_SYMBOL_PREFIX)
    >
    > I'm experimenting with the idea, but I haven't managed to get it working
    > yet.

    presumably you're having trouble with the preprocessor using the
    define name literally instead of expanding it. you can address this
    two ways:
    - force gcc to expand it wit a few more levels
    - define the macro on the command line

    here is the first way:
    $ cat test.c
    #include <stdio.h>
    foo() { puts("foo"); }
    _foo() { puts("_foo"); }
    __foo() { puts("__foo"); }
    #define __SYM(x) ___SYM(PFX, x) /* queue PFX */
    #define ___SYM(pfx,x) ____SYM(pfx, x) /* expand PFX */
    #define ____SYM(pfx,x) pfx##x /* paste them together */
    main() { __SYM(foo)(); }
    $ gcc test.c -DPFX=_ && ./a.out
    _foo
    and here is the second:
    $ cat test.c
    #include <stdio.h>
    foo() { puts("foo"); }
    _foo() { puts("_foo"); }
    __foo() { puts("__foo"); }
    main() { __SYM(foo)(); }
    $ gcc test.c -D'__SYM(x)=_##x' && ./a.out
    _foo
    HTH
    -mike
    --
    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: 2009-11-04 12:15    [W:0.396 / U:0.292 seconds]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean