The first lines are standard start up commands for any application. The execve call is the system call to initialize a new executable. The brk call returns the current memory address, and the mmap call allocates 4,096 bytes of memory for dynamic libraries and other applications that load housekeeping.
The attempt to access ld.so.preload fails because ld.so.preload is a hook to preload the libraries. It is not required on most production systems.
The ld.so.cache file is the memory-resident copy of /etc/ld.so,conf.d, which contains the paths for loading dynamic libraries. These values are kept in memory to reduce the overhead in starting programs.
The next lines with mmap, mprotect, arch_prctl, and munmap calls continue to load the libraries and mapping devices to memory.
The two calls to brk are invoked by the program's malloc call. This allocates 100 bytes from the heap.
The strcat call is a user-space function that doesn't generate any system calls.
The printf call doesn't generate a system call to format the data, but it makes calls to send the formatted string to stdout.
The fstat and mmap calls load and initialize the stdout device. These calls occur only once in a program that generates output to stdout.
The write system call sends the string to stdout.
Finally, the exit_group call exits the program, frees resources, and terminates all the threads associated with the executable.
Note that there is no brk call associated with freeing memory. The malloc and free functions are user-space functions that manage a task's memory. They only invoke the brk function if the program's overall memory footprint changes. When your program allocates N bites, it needs to add that many bytes to its available memory. When it frees that block, the memory is marked available, but it remains a part of this program's memory pool. The next malloc uses memory from the pool of available memory space until it's exhausted. At this point, another brk call adds more memory to the program's memory pool.