20 Dec, 2011

1 commit

  • The following patch implements the dynamic relocation processing for
    PPC32 kernel. relocate() accepts the target virtual address and relocates
    the kernel image to the same.

    Currently the following relocation types are handled :

    R_PPC_RELATIVE
    R_PPC_ADDR16_LO
    R_PPC_ADDR16_HI
    R_PPC_ADDR16_HA

    The last 3 relocations in the above list depends on value of Symbol indexed
    whose index is encoded in the Relocation entry. Hence we need the Symbol
    Table for processing such relocations.

    Note: The GNU ld for ppc32 produces buggy relocations for relocation types
    that depend on symbols. The value of the symbols with STB_LOCAL scope
    should be assumed to be zero. - Alan Modra

    Signed-off-by: Suzuki K. Poulose
    Signed-off-by: Josh Poimboeuf
    Cc: Paul Mackerras
    Cc: Benjamin Herrenschmidt
    Cc: Alan Modra
    Cc: Kumar Gala
    Cc: linuxppc-dev
    Signed-off-by: Josh Boyer

    Suzuki Poulose
     

24 Sep, 2009

1 commit

  • When using CONFIG_RELOCATABLE, we build the kernel as a position
    independent executable. The kernel then uses a little bit of relocation
    code to relocate itself. That code only deals with R_PPC64_RELATIVE
    relocations though. If for some reason you use assembly constructs
    such as LOAD_REG_IMMEDIATE() to load the address of a symbol, you'll
    generate different kinds of relocations that won't be processed properly
    and bad things will happen. (We have 2 such bugs today).

    The perl script tries to filter out "known" bad ones. It's possible
    that we are missing some in the case of a weak function that nobody
    implements, we'll see if we get false positive and fix it.

    Signed-off-by: Tony Breeds
    Signed-off-by: Benjamin Herrenschmidt

    Tony Breeds