typedef unsigned long long u64;
typedef unsigned int u32;
static inline void dkexit(int c){ register long rax __asm__("rax")=60; register long rdi __asm__("rdi")=c; __asm__ volatile("syscall"::"a"(rax),"D"(rdi):"rcx","r11","memory"); }
static u64 dkaux(int argc,char**argv,u64 t){ char**e=argv+argc+1; while(*e)e++; u64*p=(u64*)(e+1); for(;p[0];p+=2) if(p[0]==t) return p[1]; return 0; }
static void dktls(int argc,char**argv,int areasz){
u64 phdr=dkaux(argc,argv,3), phent=dkaux(argc,argv,4), phnum=dkaux(argc,argv,5);
if(!phdr||!phent) return;
const char*init=0; u64 filesz=0,memsz=0,align=64;
for(u64 i=0;i<phnum;i++){
const u32*ph=(const u32*)(phdr+i*phent);
if(ph[0]==7){ init=(const char*)(((const u64*)ph)[2]); filesz=((const u64*)ph)[4]; memsz=((const u64*)ph)[5]; align=((const u64*)ph)[6]; break; }
}
if(!memsz) return;
if(align<16) align=16;
u64 tls_size=(memsz+align-1)/align*align;
static char area[1<<16] __attribute__((aligned(64)));
char* block=area; char* tp=block+tls_size;
for(u64 i=0;i<tls_size;i++) block[i]=0;
for(u64 i=0;i<filesz;i++) block[tls_size-filesz+i]=init[i];
static void* dtv[4]; dtv[0]=(void*)1; dtv[1]=block;
void**tcb=(void**)tp; tcb[0]=tp; tcb[1]=&dtv[0]; tcb[2]=tp; ((int*)tp)[6]=0;
(void)areasz;
__asm__ volatile("wrfsbase %0"::"r"((u64)tp));
}
extern "C" int __libc_start_main(int(*m)(int,char**,char**),int c,char**v){ m(c,v,v+c+1); dkexit(0); }
int main(){ return 0; }
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 1.3 us | 4 KB | Accepted | Score: 100 | 显示更多 |