/branches/dynload/uspace/lib/libc/shared/arch/mips32/_link.ld.in |
---|
0,0 → 1,104 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
interp PT_INTERP; |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
dynamic PT_DYNAMIC; |
} |
SECTIONS { |
. = 0x4000 + SIZEOF_HEADERS; |
.interp : { |
*(.interp); |
} :text :interp |
/* Align on word boundary -- instructions will follow. */ |
. = ALIGN(4); |
.init : { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
*(.MIPS.stubs); |
} :text |
.hash : { |
*(.hash); |
} : text |
.reginfo : { |
*(.reginfo); |
} : text |
.rel.plt : { |
*(.rel.plt); |
} : text |
/* |
*.rel.dyn MUST FOLLOW IMMEDIATELY after .rel.plt |
* without alignment gap or DT_REL will be broken |
*/ |
.rel.dyn : { |
*(.rel.*); |
} :text |
.plt : { |
*(.plt); |
} : text |
.dynsym : { |
*(.dynsym); |
} : text |
.dynstr : { |
*(.dynstr); |
} : text |
. = . + 0x4000; |
.dynamic : { |
*(.dynamic); |
} :data :dynamic |
.data : { |
*(.data); |
*(.data.rel*); |
} :data |
.got : { |
_gp = .; |
*(.got); |
} :data |
/* |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
*/ |
.sbss : { |
*(.scommon); |
*(.sbss); |
} |
.bss : { |
*(.bss); |
*(COMMON); |
} :data |
. = ALIGN(0x4000); |
_heap = .; |
/* /DISCARD/ : { |
*(*); |
}*/ |
} |
/branches/dynload/uspace/lib/libc/shared/arch/mips32/_lib.ld.in |
---|
0,0 → 1,95 |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
dynamic PT_DYNAMIC; |
} |
SECTIONS { |
. = 0x4000 + SIZEOF_HEADERS; |
.init : { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
*(.MIPS.stubs); |
} :text |
.hash : { |
*(.hash); |
} : text |
.reginfo : { |
*(.reginfo); |
} : text |
.rel.plt : { |
*(.rel.plt); |
} : text |
/* |
*.rel.dyn MUST FOLLOW IMMEDIATELY after .rel.plt |
* without alignment gap or DT_REL will be broken |
*/ |
.rel.dyn : { |
*(.rel.*); |
} :text |
.plt : { |
*(.plt); |
} : text |
.dynsym : { |
*(.dynsym); |
} : text |
.dynstr : { |
*(.dynstr); |
} : text |
. = . + 0x4000; |
.dynamic : { |
*(.dynamic); |
} :data :dynamic |
.data : { |
*(.data); |
*(.data.rel*); |
} :data |
.got : { |
_gp = .; |
*(.got); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.sbss : { |
*(.scommon); |
*(.sbss); |
} |
.bss : { |
*(.bss); |
*(COMMON); |
} :data |
. = ALIGN(0x4000); |
_heap = .; |
/* /DISCARD/ : { |
*(*); |
}*/ |
} |
/branches/dynload/uspace/lib/libc/Makefile |
---|
119,7 → 119,7 |
-makedepend $(DEFS) $(PIC_CFLAGS) -o.pio -f - $(ARCH_SOURCES) $(GENERIC_SOURCES) >> Makefile.depend 2> /dev/null |
libc.a: depend $(OBJECTS) |
$(AR) rc $@ $(LIBS) $(OBJECTS) $(RTLD_PREFIX)/librtld.a |
$(AR) rc $@ $(LIBS) $(OBJECTS) |
libc.pic.a: depend $(PIC_OBJECTS) |
$(AR) rc $@ $(LIBS) $(PIC_OBJECTS) |
/branches/dynload/uspace/lib/libc/arch/mips32/src/tls.c |
---|
46,5 → 46,25 |
tls_free_variant_1(tcb, size); |
} |
typedef struct { |
unsigned long ti_module; |
unsigned long ti_offset; |
} tls_index; |
void *__tls_get_addr(tls_index *ti); |
/* mips32 uses TLS variant 1 */ |
void *__tls_get_addr(tls_index *ti) |
{ |
uint8_t *tls; |
uint32_t v; |
tls = (uint8_t *)__tcb_get() + sizeof(tcb_t); |
/* Hopefully this is right. No docs found. */ |
v = (uint32_t) (tls + ti->ti_offset + 0x8000); |
return (void *) v; |
} |
/** @} |
*/ |