This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.
See the CrossGCC FAQ for lots more information.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
I'm not sure if it belongs here, but lets give it a try...
I built ARM EABI toolchain using OSELAS.Toolchain
arm-v4t-linux-gnueabi_gcc-4.4.0_glibc-2.9_binutils-2.19.1_kernel-2.6.29-sanitized.ptxconfig
and run freshly built userland with 2.6.32-rc5 kernel on OMAP5910 (ARM925)
based board. Running every single binary triggers alignment trap.
Here's illustrative example (after boot):
# cat /proc/cpu/alignment
User: 201
System: 0
Skipped: 0
Half: 0
Word: 0
Multi: 0
User faults: 0 (ignored)
# echo 3 > /proc/cpu/alignment
# cat /proc/cpu/alignment
Alignment trap: cat (236) PC=0x4000aba8 Instr=0xe7951002 Address=0x4022b9a7 FSR 0x001
Alignment trap: cat (236) PC=0x4000abb4 Instr=0xe7851002 Address=0x4022b9a7 FSR 0x811
Alignment trap: cat (236) PC=0x4000aba8 Instr=0xe7951002 Address=0x4022bffa FSR 0x001
Alignment trap: cat (236) PC=0x4000abb4 Instr=0xe7851002 Address=0x4022bffa FSR 0x801
User: 205
System: 0
Skipped: 0
Half: 0
Word: 4
Multi: 0
User faults: 3 (fixup+warn)
Looking at process map shows that 0x4000aba8 belongs to /lib/ld-2.9.so address
space and objdump finds out (somehow long, but I do not want to cut is out of
context):
void
_dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
aad4: e50bc094 str ip, [fp, #-148]
elf_dynamic_do_rel (struct link_map *map,
ElfW(Addr) reladdr, ElfW(Addr) relsize,
int lazy)
{
const ElfW(Rel) *r = (const void *) reladdr;
const ElfW(Rel) *end = (const void *) (reladdr + relsize);
aad8: e0828003 add r8, r2, r3
#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP
/* We never bind lazily during ld.so bootstrap. Unfortunately gcc is
not clever enough to see through all the function calls to realize
that. */
if (lazy)
aadc: 0a00001d beq ab58 <_dl_relocate_object+0x1dc>
{
/* Doing lazy PLT relocations; they need very little info. */
for (; r < end; ++r)
aae0: e1530008 cmp r3, r8
aae4: 2a00000e bcs ab24 <_dl_relocate_object+0x1a8>
__attribute__ ((always_inline))
elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rel *reloc)
{
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
aae8: e5d31004 ldrb r1, [r3, #4]
/* Check for unexpected PLT reloc type. */
if (__builtin_expect (r_type == R_ARM_JUMP_SLOT, 1))
aaec: e3510016 cmp r1, #22 ; 0x16
auto inline void
__attribute__ ((always_inline))
elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rel *reloc)
{
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
aaf0: e5932000 ldr r2, [r3]
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
/* Check for unexpected PLT reloc type. */
if (__builtin_expect (r_type == R_ARM_JUMP_SLOT, 1))
aaf4: 1a000369 bne b8a0 <_dl_relocate_object+0xf24>
{
if (__builtin_expect (map->l_mach.plt, 0) == 0)
aaf8: e594120c ldr r1, [r4, #524]
auto inline void
__attribute__ ((always_inline))
elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rel *reloc)
{
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
aafc: e0852002 add r2, r5, r2
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
/* Check for unexpected PLT reloc type. */
if (__builtin_expect (r_type == R_ARM_JUMP_SLOT, 1))
{
if (__builtin_expect (map->l_mach.plt, 0) == 0)
ab00: e3510000 cmp r1, #0 ; 0x0
*reloc_addr += l_addr;
ab04: 05921000 ldreq r1, [r2]
ab08: e2833008 add r3, r3, #8 ; 0x8
ab0c: 00811005 addeq r1, r1, r5
ab10: 05821000 streq r1, [r2]
else
*reloc_addr = map->l_mach.plt;
ab14: 15821000 strne r1, [r2]
ab18: e1580003 cmp r8, r3
ab1c: 8afffff1 bhi aae8 <_dl_relocate_object+0x16c>
(void *) (l_addr + r->r_offset));
}
}
#ifndef RTLD_BOOTSTRAP
else
for (; r < end; ++r)
ab20: e5945000 ldr r5, [r4]
ab24: e51b1064 ldr r1, [fp, #-100]
l->l_lookup_cache.value = _lr; })) \
: l)
#include "dynamic-link.h"
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
ab28: e51b2094 ldr r2, [fp, #-148]
ab2c: e281100c add r1, r1, #12 ; 0xc
ab30: e1510002 cmp r1, r2
ab34: e50b1064 str r1, [fp, #-100]
ab38: 0a000212 beq b388 <_dl_relocate_object+0xa0c>
#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP
/* We never bind lazily during ld.so bootstrap. Unfortunately gcc is
not clever enough to see through all the function calls to realize
that. */
if (lazy)
ab3c: e51b3064 ldr r3, [fp, #-100]
ab40: e511200c ldr r2, [r1, #-12]
ab44: e5131008 ldr r1, [r3, #-8]
ab48: e5133010 ldr r3, [r3, #-16]
ab4c: e3510000 cmp r1, #0 ; 0x0
elf_dynamic_do_rel (struct link_map *map,
ElfW(Addr) reladdr, ElfW(Addr) relsize,
int lazy)
{
const ElfW(Rel) *r = (const void *) reladdr;
const ElfW(Rel) *end = (const void *) (reladdr + relsize);
ab50: e0828003 add r8, r2, r3
#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP
/* We never bind lazily during ld.so bootstrap. Unfortunately gcc is
not clever enough to see through all the function calls to realize
that. */
if (lazy)
ab54: 1affffe1 bne aae0 <_dl_relocate_object+0x164>
}
else
#endif
{
const ElfW(Sym) *const symtab =
(const void *) D_PTR (map, l_info[DT_SYMTAB]);
ab58: e5941038 ldr r1, [r4, #56]
ElfW(Word) nrelative = (map->l_info[RELCOUNT_IDX] == NULL
ab5c: e59460bc ldr r6, [r4, #188]
}
else
#endif
{
const ElfW(Sym) *const symtab =
(const void *) D_PTR (map, l_info[DT_SYMTAB]);
ab60: e5911004 ldr r1, [r1, #4]
ElfW(Word) nrelative = (map->l_info[RELCOUNT_IDX] == NULL
ab64: e3560000 cmp r6, #0 ; 0x0
}
else
#endif
{
const ElfW(Sym) *const symtab =
(const void *) D_PTR (map, l_info[DT_SYMTAB]);
ab68: e50b1068 str r1, [fp, #-104]
ElfW(Word) nrelative = (map->l_info[RELCOUNT_IDX] == NULL
ab6c: 0a000004 beq ab84 <_dl_relocate_object+0x208>
ab70: e5961004 ldr r1, [r6, #4]
ab74: e1a021a2 lsr r2, r2, #3
ab78: e1520001 cmp r2, r1
ab7c: 21a02001 movcs r2, r1
ab80: e1a06182 lsl r6, r2, #3
_dl_rtld_map, which is incompatible with a weak decl in the same
file. */
# ifndef SHARED
weak_extern (GL(dl_rtld_map));
# endif
if (map != &GL(dl_rtld_map)) /* Already done in rtld itself. */
ab84: e51bc08c ldr ip, [fp, #-140]
ab88: e154000c cmp r4, ip
const ElfW(Sym) *const symtab =
(const void *) D_PTR (map, l_info[DT_SYMTAB]);
ElfW(Word) nrelative = (map->l_info[RELCOUNT_IDX] == NULL
? 0 : map->l_info[RELCOUNT_IDX]->d_un.d_val);
const ElfW(Rel) *relative = r;
r = r + MIN (nrelative, relsize / sizeof (ElfW(Rel)));
ab8c: e0836006 add r6, r3, r6
_dl_rtld_map, which is incompatible with a weak decl in the same
file. */
# ifndef SHARED
weak_extern (GL(dl_rtld_map));
# endif
if (map != &GL(dl_rtld_map)) /* Already done in rtld itself. */
ab90: 0a000009 beq abbc <_dl_relocate_object+0x240>
/* Rela platforms get the offset from r_addend and this must
be copied in the relocation address. Therefore we can skip
the relative relocations only if this is for rel
relocations or rela relocations if they are computed as
memory_loc += l_addr... */
if (l_addr != 0)
ab94: e3550000 cmp r5, #0 ; 0x0
ab98: 0a000007 beq abbc <_dl_relocate_object+0x240>
# else
/* ...or we know the object has been prelinked. */
if (l_addr != 0 || ! map->l_info[VALIDX(DT_GNU_PRELINKED)])
# endif
#endif
for (; relative < r; ++relative)
ab9c: e1530006 cmp r3, r6
aba0: 2a000005 bcs abbc <_dl_relocate_object+0x240>
auto inline void
__attribute__ ((always_inline))
elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
void *const reloc_addr_arg)
{
Elf32_Addr *const reloc_addr = reloc_addr_arg;
aba4: e4932008 ldr r2, [r3], #8
*reloc_addr += l_addr;
aba8: e7951002 ldr r1, [r5, r2]
abac: e1560003 cmp r6, r3
abb0: e0811005 add r1, r1, r5
abb4: e7851002 str r1, [r5, r2]
abb8: 8afffff9 bhi aba4 <_dl_relocate_object+0x228>
#ifdef RTLD_BOOTSTRAP
/* The dynamic linker always uses versioning. */
assert (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL);
#else
if (map->l_info[VERSYMIDX (DT_VERSYM)])
abbc: e59430e4 ldr r3, [r4, #228]
abc0: e3530000 cmp r3, #0 ; 0x0
abc4: 0a00012b beq b078 <_dl_relocate_object+0x6fc>
#endif
... etc ...
So every dynamically linked binary will trigger it. I'm used to set
/proc/cpu/alignment to be 4, to catch all programs which slows down system
and this problem prevents me from doing so. Btw, why is default value 0?
Silently ignoring problem sounds like strange approach.
Anyone ever hit this?
Thanks,
ladis
--
For unsubscribe information see http://sourceware.org/lists.html#faq
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |