kexec-tools-2.0.1 and CFLAGS
Simon Horman
horms at verge.net.au
Wed Aug 26 02:31:20 EDT 2009
On Thu, Aug 20, 2009 at 10:14:19PM +0900, Magnus Damm wrote:
> Hi Simon, Everyone,
>
> Kexec-tools 2.0.1 seems to build only with optimization enabled. If I
> set CFLAGS before calling configure and remove the "-O2" then the code
> won't link properly. I found it while cross compiling for SuperH, but
> it's most likely an issue on other platforms as well. Have a look at
> the "-O0" below:
>
> $ AR=_ar CC=_gcc CFLAGS="-O0" LDFLAGS="-static" ./configure
> --prefix=/ --host="sh3-linux" --without-zlib --without-xen
> ....
> $ make
> ...
> _gcc -static -o build/sbin/kexec kexec/kexec.o kexec/ifdown.o
> kexec/kexec-elf.o kexec/kexec-elf-exec.o kexec/kexec-elf-core.o
> kexec/kexec-elf-rel.o kexec/kexec-elf-boot.o kexec/kexec-iomem.o
> kexec/firmware_memmap.o kexec/crashdump.o kexec/crashdump-xen.o
> kexec/phys_arch.o kexec/proc_iomem.o kexec/arch_reuse_initrd.o
> kexec/arch/sh/kexec-sh.o kexec/arch/sh/kexec-zImage-sh.o
> kexec/arch/sh/kexec-netbsd-sh.o kexec/arch/sh/kexec-elf-sh.o
> kexec/arch/sh/kexec-elf-rel-sh.o kexec/arch/sh/netbsd_booter.o
> kexec/arch/sh/crashdump-sh.o kexec/purgatory.o libutil.a
> kexec/arch/sh/kexec-elf-rel-sh.o: In function `machine_apply_elf_rel':
> kexec-elf-rel-sh.c:(.text+0x1b0): undefined reference to
> `bad_unaligned_access_length'
> kexec-elf-rel-sh.c:(.text+0x288): undefined reference to
> `bad_unaligned_access_length'
> collect2: ld returned 1 exit status
> make: *** [build/sbin/kexec] Error 1
>
> This issue is most likely related to get_unaligned() and
> put_unaligned() having bad_unaligned_access_length() in their default
> case that never gets optimized away.
>
> Anyway, not very important. But at least you know now. =)
Hi Magnus,
I'm some what dubious about this, but it appears to be intentional that
get_unaligned() doesn't exist:
---- From kexec/kexec.h ----
/*
* This function doesn't actually exist. The idea is that when someone
* uses the macros below with an unsupported size (datatype), the linker
* will alert us to the problem via an unresolved reference error.
*/
extern unsigned long bad_unaligned_access_length (void);
#define get_unaligned(loc) \
({ \
__typeof__(*(loc)) _v; \
size_t size = sizeof(*(loc)); \
switch(size) { \
case 1: case 2: case 4: case 8: \
memcpy(&_v, (loc), size); \
break; \
default: \
_v = bad_unaligned_access_length(); \
break; \
} \
_v; \
})
#define put_unaligned(value, loc) \
do { \
size_t size = sizeof(*(loc)); \
__typeof__(*(loc)) _v = value; \
switch(size) { \
case 1: case 2: case 4: case 8: \
memcpy((loc), &_v, size); \
break; \
default: \
bad_unaligned_access_length(); \
break; \
} \
} while(0)
More information about the kexec
mailing list