#define DK_ENVIRON
#define DK_IREL
#define DK_INIT
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* dkauxv(int argc,char**argv){ char**e=argv+argc+1; while(*e)e++; return (u64*)(e+1); }
static u64 dkaux(int argc,char**argv,u64 t){ u64*p=dkauxv(argc,argv); for(;p[0];p+=2) if(p[0]==t) return p[1]; return 0; }
struct Rela_ { u64 o; u64 i; long a; };
#ifdef DK_IREL
static void dkirel(){ extern const Rela_ __rela_iplt_start[] __attribute__((weak)); extern const Rela_ __rela_iplt_end[] __attribute__((weak));
if(!__rela_iplt_start||!__rela_iplt_end) return;
for(const Rela_*p=__rela_iplt_start;p<__rela_iplt_end;p++) if((u32)p->i==37){ void*(*r)(void)=(void*(*)(void))p->a; *(void**)p->o=r(); } }
#endif
#ifdef DK_TLS
static void dktls(int argc,char**argv){
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[256] __attribute__((aligned(64)));
char* block=area; char* tp=block+tls_size; (void)tp;
for(u64 i=0;i<tls_size;i++) *(volatile char*)(block+i)=0;
for(u64 i=0;i<filesz;i++) *(volatile char*)(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; ((volatile int*)tp)[6]=0;
__asm__ volatile("wrfsbase %0"::"r"((u64)tp));
}
#endif
extern "C" char **environ;
extern "C" int __libc_start_main(int(*m)(int,char**,char**),int c,char**v,void(*init)(void),void(*fini)(void),void(*rtld)(void),void*se){
(void)fini;(void)rtld;(void)se;
char** envp = v+c+1;
#ifdef DK_ENVIRON
environ = envp;
#endif
#ifdef DK_IREL
dkirel();
#endif
#ifdef DK_TLS
dktls(c,v);
#endif
#ifdef DK_INIT
if(init) init();
#endif
m(c,v,envp);
dkexit(0);
return 0;
}
int plus(int a,int b){ return a+b; }
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 2.98 us | 8 KB | Runtime Error | Score: 0 | 显示更多 |