When I see the assembly code of a C app, like this:
emacs hello.c clang -S -O hello.c -o hello.s cat hello.s Function names are prefixed with an underscore (e.g. callq _printf). Why is this done and what advantages does it have?
Example:
hello.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *myString = malloc(strlen("Hello, World!") + 1); memcpy(myString, "Hello, World!", strlen("Hello, World!") + 1); printf("%s", myString); return 0; } hello.s
_main: ; Here Leh_func_begin0: pushq %rbp Ltmp0: movq %rsp, %rbp Ltmp1: movl $14, %edi callq _malloc ; Here movabsq $6278066737626506568, %rcx movq %rcx, (%rax) movw $33, 12(%rax) movl $1684828783, 8(%rax) leaq L_.str1(%rip), %rdi movq %rax, %rsi xorb %al, %al callq _printf ; Here xorl %eax, %eax popq %rbp ret Leh_func_end0: