This section describes the switches accepted by the compiler driver, cc. The compiler driver is capable of controlling compilation by all supported language compilers and the final link by the linker. It can also construct libraries automatically.
The compiler driver uses file extensions to distinguish the language the source file is written in. The compiler driver recognizes the extension .c as C source files, .s and .asm as assembly code files.
The compiler driver recognizes the extension .hzo as object files, .hza as library files and .xml as special-purpose XML files.
We strongly recommend that you adopt these extensions for your source files and object files because you'll find that using the tools is much easier if you do.
When the compiler driver finds a file with a .c extension, it runs the C compiler to convert it to object code. Alternatively you can specify that it is a C file using
cc -x c cfile.notc ...
When the compiler driver finds a file with a .s or .asm extension, it runs the C preprocessor and then the assembler to convert it to object code. Alternatively you can specify that it is an assembly language file using
cc -x asm asmfile.nots ...
When the compiler driver finds a file with a .hzo or .hza extension, it passes it to the linker to include it in the final application.
To compile or assemble a file you should supply the -c option together with the source file and provide a name for the output file using the -o option
cc -c file.c -o file.o
if you don't supply an output name then the output file will be use the basename of the source file.
You can supply the file to be compiled from the standard input using the
cc -c - -o main.o int main() { return 3; } <EOF>
You can preprocess the source file rather than compile it using the -E option
cc -E main.c
This will send the output to the standard output or you can use -o to send it to a named file.
You can show the preprocessor defines that are defined for the compilation using the -dM option
cc -E -dM main.c
You can supply preprocessor defines and include directories using -D and -I options
cc -c file.c -Dmydefine -Imyincludedir
You can include a file before compilation using -include
cc -c file.c -include file.h
There is also a variant that will just use the #defines that are declared in the included file
cc -c file.c -imacros file.h
If you wish to not use the default C/C++ library you can use -I- and then supply your own system library directory using -isystem
cc -c file.c -I- -isystemmysystemincludedir
You can using the -g option to include debugging information in the output file
cc -c file.c -g
You can use the -O option to set the desired optimization level
cc -c file.c -O0
You can compile/link a number of files with the standard libraries
cc Cortex_M_Startup.s thumb_crt0.s main.o -o main.elf
You'll also need to supply linker control details. There are a number of ways of doing this
cc .. -placement ram_placement.xml -placementsegments "SRAM RW 0x0 0x1000" -ereset_handler
cc .. -memorymap map.xml -placementsegments "SRAM RW 0x0 0x1000" -ereset_handler
cc .. -Tlinker.icf -ereset_handler
You can create a precompile header using the -pch option
cc -c -xc -pch main.h -o main.h.pch
Note that the output file must be in the same directory as the input file. You can use this precompiled header file
cc -c main.c -include-pch main.h.pch
You can create a C++ 20 module using
cc++ -c -xc++ main.cxx -std=c++20 -fmodules-ts -fmodule-file=main=main.o -o main.o
The module file will be named either .gcm or .pcm and can be used by another file using
cc++ -c -xc++ another.cxx -std=c++20 -fmodules-ts -fmodule-file=main=main.o -o another.o
Option | Description |
- | input is taken from standard input |
-### | show commands but don't execute them |
-allow-multiple-definition | allow multiple symbol definition when linking |
-ansi | enforce ANSI checking |
-ar | create library from input files |
-arch=val | set cpu architecture to 'val', use list to display supported |
-arm | generate ARM code |
-arm64 | generate ARM64 code |
-be | big endian target |
-be8 | big endian target |
-builtins | use builtin compiler functions |
-c | compile the files, no link/library |
-cmselib=l | create cmse output library in 'l' |
-codec=c | set file codec to 'c', use list to display supported |
-common | allocate global variables in the common section |
-cpu=val | set cpu core to 'val', use list to display supported |
-depend file | generate dependency file in 'file' |
-dependu file | generate dependency file in 'file' with user header files only |
-dM | show #defines |
-Dname | define the preprocessor macro 'name' |
-Dname=val | define the preprocessor macro 'name' as 'val' |
-dname=val | define the linker symbol 'name' as 'val' |
-E | preprocess file and write to standard output |
-emit-relocs | emit relocations into executable |
-ename | set program entry symbol to 'name' |
-exceptions | enable C++ exceptions |
-Fbin | create an additional binary output file |
-fbuiltin | enable compiler builtin functions |
-fcommon | place global variables in COMMON section |
-fcoroutines | enable C++ coroutine support |
-fdebug-types-section | generate .debug_types section |
-fdiagnostics-color=always | color diagnostic output of the compiler |
-fdiagnostics-color=never | do not color diagnostic output of the compiler |
-fdiagnostics-show-caret | show caret in diagostic output of the compiler |
-fexceptions | enable C++ exception support |
-Fhex | create an additional hex output file |
-fill=b | fill gaps in the additional output file with byte 'b' |
-flto | generate code suitable for link time optimization |
-fmath-errno | set errno after calling math functions |
-fmodule-file='name' | get module dependencies from the file 'name' |
-fmodules-ts | enable c++20 modules |
-fno-builtin | disable compiler builtin functions |
-fno-common | place global variables in bss section |
-fno-diagnostics-show-caret | do not show caret in diagostic output of the compiler |
-fno-exceptions | disable C++ exception support |
-fno-math-errno | set errno after calling math functions |
-fno-omit-frame-pointer | disable framepointer generation |
-fno-rtti | disable C++ RTTI support |
-fno-short-enums | enumerations are int sized |
-fno-short-wchar | wide characters are 32-bit |
-fno-signed-char | char is considered to be unsigned char |
-fomit-frame-pointer | disable framepointer generation |
-fpabi=hard | generate FPU instructions passing fp arguments in FPU registers |
-fpabi=soft | do not generate FPU instructions |
-fpabi=softfp | generate FPU instructions passing fp arguments in CPU registers |
-fpu=val | set fpu to 'val', use list to display supported |
-framepointer | generate code to maintain a frame pointer register |
-frtti | enable C++ RTTI support |
-fshort-enums | enumerations are minimal container sized |
-fshort-wchar | wide characters are 16-bit |
-fsigned-char | char is considered to be signed char |
-Fsrec | create an additional srec output file |
-ftree-vectorize | perform vectorization on trees |
-funwind-tables | generate unwind tables |
-g1 | generate only backtrace and line number debugging information |
-g2 | generate level 1 and variable display debugging information |
-g3 | generate level 2 and macro display debugging information |
-gcc | use gcc assembler/compiler/lto |
-gcc-target=name | select gcc 'name' tools to use |
-gdwarf-2 | generate dwarf-2 debugging information |
-gdwarf-3 | generate dwarf-3 debugging information |
-gdwarf-4 | generate dwarf-4 debugging information |
-gdwarf-5 | generate dwarf-5 debugging information |
-gnu-ld | use gnu linker |
-gpubnames | generate .debug_pubnames and .debug_pubtypes sections |
-hascmse | v8m architecture has cmse instructions |
-hascrc | v8a architecuture has crc instructions |
-hascrypto | v8a architecture has crypto instructions |
-hasdsp | v8m architecture has dsp instructions |
-hasidiv | v7ar architecture has integer divide instructions |
-hassmallmultiplier | cortex-m0/m0+/m1 architecture has small multiplier |
-heap=basic | use basic heap implementation |
-heap=minimal | use minimal heap implementation |
-heap=rt | use real-time heap implementation |
-help | show this text |
-I- | do not search any standard directories for include files |
-Idir | add 'dir' to the end of the user include search list |
-imacros file | same as -include but only keep #defines |
-include file | #include 'file' before the source file |
-include-pch file | #include precompiled header 'file' before the source file |
-inputfiles file | list of files in 'file' to link or archive |
-instrument | instrument functions |
-io=none | use user supplied implementation for library io |
-io=rtt | use RTT implementation for library io |
-io=semihost | use semihosted implementation for library io |
-io=semihostf | use host formatted semihosted implementation for library io |
-io=swo | use SWO implementation for library io |
-io=swoi | use SWO with interrupts disabled implementation for library io |
-isystem dir | add 'dir' to the end of the system include search list |
-Jdir | add 'dir' to the end of the system include search list |
-kasm | keep assembly code output |
-kind | keep indirect files |
-kldscript | keep generated linker script |
-klto | keep lto generated files |
-Kname | keep symbol 'name' in the linked output |
-kpp | keep preprocessor output |
-l- | disable linking of standard libraries |
-Ldir | search directory 'dir' to find libraries |
-le | little endian target |
-libdir dir | specify system library directory 'dir' |
-lname | search library 'name' to resolve symbols |
-locales=minimal | locales implementation |
-longcalls | generate long calling instruction sequences |
-lunwind | generate stack unwind tables |
-M | generate linkage map file |
-march=val | set cpu architecture to 'val', use list to display supported |
-marm | generate arm code |
-mbe8 | big endian target |
-mbig-endian | big endian target |
-mcmse | v8m architecture has cmse instructions |
-mcpu=val | set cpu core to 'val', use list to display supported |
-memorymap file | supply memory map file in 'file' |
-memorymapmacros macros | define macros for memory map file in 'macros' |
-mfloat-abi=val | specify the floating-point abi to use, val can be 'soft', 'softfp', 'hard' |
-mfp16-format=ieee | specify the format of the __fp16 half-precision floating-point type |
-mfpu=val | set fpu to 'val', use list to display supported |
-mlittle-endian | little endian target |
-mno-thumb-interwork | do not generate interworking code for v4t architecture |
-mno-unaligned-access | disable unaligned word and half-word load/store instructions |
-mthumb | generate thumb code, default is to generate ARM code for processors that support it |
-mtp=soft | specify the thread local storage model |
-munaligned-access | enable unaligned word and half-word load/store instructions |
-n | show commands but don't execute them |
-nodefaultlibs | disable linking of standard libraries |
-noshortenums | enumerations are int sized |
-noshortwchar | wide characters are 32-bit |
-nostderr | redirect output from stderr to stdout |
-nostdinc | do not search any standard directories for include files |
-nostdlib | disable linking of standard libraries |
-nowarn-enumsize | no linker warning on mismatched enum sized input files |
-nowarn-mismatch | no linker warning on mismatched architecture input files |
-nowarn-rwx-segments | no linker warning on load segments with RWX permissions |
-nowarn-wcharsize | no linker warning on mismatched wchar sized input files |
-o file | leave output in 'file' |
-O0 | set optimization level to level 0 |
-O1 | set optimization level to level 1 |
-O2 | set optimization level to level 2 |
-O3 | set optimization level to level 3 |
-Os | set optimization level to optimize for size |
-Oz | set optimization level to optimize for more size |
-patch cmd | run 'cmd' after link but before the creation of the additional output file |
-pch | generate a precompiled header file |
-pedantic | warning on non-standard language usage |
-pedantic-errors | error on non-standard language usage |
-placement file | supply placement file in 'file' |
-placementmacros macros | define macros for placement file in 'macros' |
-placementsegments segments | memory segments for placement in 'segments' |
-printf=d[ll][w] | double, optional long long, optional wchar |
-printf=f[ll][w] | float, optional long long, optional wchar |
-printf=i[p][w] | integer, optional width and precision, optional wchar |
-printf=ll[p][w] | long long integer, optional width and precision, optional wchar |
-Rc,name | name the default code section to 'name' |
-Rd,name | name the default data section to 'name' |
-Rk,name | name the default const section to 'name' |
-rtti | enable C++ rtti |
-Rz,name | name the default bss section to 'name' |
-scanf=d[ll][c] | double, optional long long, optional %[...] and %[^...] character class |
-scanf=ll[c] | long long integer, optional %[...] and %[^...] character class |
-segger | use SEGGER assembler/compiler/lto |
-segger-ld | use SEGGER linker |
-shortenums | enumerations are minimal container sized |
-shortwchar | wide characters are 16-bit |
-simd=neon | generate simd vector processing code |
-stack-sizes | generate stack-sizes section |
-std=s | set language standard to 's', use list to display supported |
-stop | generate stack overflow protection code |
-stripdebug | strip debug information from linked executable |
-stripsymbols | strip symbols from linked executable |
-symbols=s | link symbols file 's' into executable |
-Tfile | use 'file' as linker script |
-thumb | generate thumb code, default is to generate ARM code for processors that support it |
-unwindtables | generate stack unwind tables |
-v | show command lines as they are executed |
-vectorize | enable auto vectorization code generation |
-W | supply option to the compiler |
-w | suppress warnings |
-Wa,x | pass 'x' to the assembler |
-Wc,x | pass 'x' to the compiler |
-we | treat warnings as errors |
-Werror | treat warnings as errors |
-Wl,x | pass 'x' to the linker |
-x t | subsequent files are considered to be of file type 't' |
-xa | subsequent files are considered to be library files |
-xasm | subsequent files are considered to be assembly code |
-xassembler-with-cpp | subsequent files are considered to be assembly code |
-xc | subsequent files are considered to be C code |
-xc++ | subsequent files are considered to be C++ code |
-Xlinker x | pass 'x' to the linker |
-xo | subsequent files are considered to be object code |