I've seen .S files in various projects such as in the Linux Kernel, FreeBSD kernel, or in some other projects. What do these files do and why can't we have .c files instead ?


.S files are source code files written in assembly. Assembly is an extremely low-level form of programming. The files contain assembly instructions to the processor in sequential order and are typically compiled based on a selected architecture. Examples of such files are often seen in the linux kernel for specific architectures, e.g. x86, sparc, ARM, etc.

For more information about assembly language:

  • X86 Assembly/GAS syntax
  • x86 Instruction list
  • TLDP Linux Assembly Howto
  • Example in the Linux kernel: arch/x86/net/bpf_jit.S

That .S is assembly language. Usually that is

Something nobody mentioned is why capital S?

  • .S (capital S) stands for assembly code that must still pass through a pre-processor. That means it can have #include and #define among other macros. It can also be seeing as extension .sx

  • .s (lower s) is pure assembly code that can be compiled into an object.

Why not using .c? Well, being an operating system, it is impossible to write everything in C. Actually, that would be ideal, and C language itself has a background history linked to help creating operating systems and diminish the amount of assembly needed to code it. But many low-level operations are too dependant of the machine.

Here a nice example of a memory copy routine for the linux boot that uses

#include <linux/linkage.h>


*.S files are assembly files.

Why .S & why not .c files?

Its because machine dependent stuff/early initialization like setting up cache & memory can only be done assembly level instruction such as I/O instructions.

The kernel doesn't have the luxury of libc library to take care of the initial set up of various resources. And hardware resources at any point even during application execution in turn call system calls which call I/O routines coded in assembly language.


The .S extension indicates an assembly language file.

Why cant we have .C files instead?

Because the raw source code — be it human-entered or compiler-generated — is assembly, not C.


They are assembler code files:

An assembly language is a low-level programming language for computers, microprocessors, microcontrollers, and other programmable devices in which each statement corresponds to a single machine language instruction. An assembly language is specific to a certain computer architecture, in contrast to most high-level programming languages, which may be more portable.

and so these files are not the same as C code files.

Note that C files can be inlined with assembly instructions.