Hi everyone, I was compiling a HPC application named NorESM on ARM64 machine with GCC7.3. I met "relocation truncated to fit" error, so I added "-mcmodel=large" and successfully built the project. However, the executable seems not executable. [xie@sms bld]$ strace ./cesm.exe execve("./cesm.exe", ["./cesm.exe"], [/* 64 vars */]) = -1 ENOMEM (Cannot allocate memory) --- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=0} --- +++ killed by SIGSEGV +++ Segmentation fault (core dumped) I found this in GCC manual aarch64 section: -mcmodel=small Generate code for the small code model. The program and its statically defined symbols must be within 4GB of each other. Programs can be statically or dynamically linked. This is the default code model. -mcmodel=large Generate code for the large code model. This makes no assumptions about addresses and sizes of sections. Programs can be statically linked only. I also compiled the project on x86-64 with intel compiler. In this situation, I added "-mcmodel=medium" and compilation and execution are successful. Below is its explanation: -mcmodel=mem_model (L*X only) Tells the compiler to use a specific memory model to generate code and store data. Architecture Restrictions: Only available on Intel(R) 64 architecture Arguments: mem_model Is the memory model to use. Possible values are: small Tells the compiler to restrict code and data to the first 2GB of address space. All accesses of code and data can be done with Instruction Pointer (IP)-relative addressing. medium Tells the compiler to restrict code to the first 2GB; it places no memory restriction on data. Accesses of code can be done with IP-relative addressing, but accesses of data must be done with absolute addressing. large Places no memory restriction on code or data. All accesses of code and data must be done with absolute addressing. Default: -mcmodel=small On systems using Intel(R) 64 architecture, the compiler restricts code and data to the first 2GB of address space. Instruction Pointer (IP)-relative addressing can be used to access code and data. Here are my questions: 1. What does "Programs can be statically linked only" means? Does it mean I must compile all dependency libraries staticly? What about the basic librarie like libc and libgcc? 2. Does GCC has similar option to separate code and data like Intel Compiler does?