I am using my own modified glibc. I saw in the compiled code that compiler was not using many standard library functions from my glibc when I linked with it. Then I put -fno-builtin flag. Things got better and I could see that many functions which were not taken from glibc were now taken from there, such as malloc.
However, still for many functions, such as mmap, the compiler is using some built-in-code. Now how can I ask the compiler to please exclusively use the code from glibc rather than using its built-in-functions?
On my x86-64 function, if I do objdump of the compiled glibc, following is the generated mmap function. I can't find equivalent code in the glibc source.
0000000000000000 <__mmap>:
0: 49 89 ca mov %rcx,%r10
3: b8 09 00 00 00 mov $0x9,%eax
8: 0f 05 syscall
a: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax
10: 0f 83 00 00 00 00 jae 16 <__mmap+0x16>
16: c3 retq
GCC provides built-in versions of the ISO C99 floating-point comparison macros that avoid raising exceptions for unordered operands. They have the same names as the standard macros ( isgreater , isgreaterequal , isless , islessequal , islessgreater , and isunordered ) , with __builtin_ prefixed.
__builtin_clz(x): This function is used to count the leading zeros of the integer. Note : clz = count leading zero's. Example: It counts number of zeros before the first occurrence of one(set bit).
on a compiler note, __builtin_memcpy can fall back to emitting a memcpy function call. also less-capable compilers the ability to simplify, by choosing the slow path of unconditionally emitting a memcpy call. http://lwn.net/Articles/29183/ Follow this answer to receive notifications.
The wrapper you disassemble above comes from the INLINE_SYSCALL macro in sysdeps/unix/sysv/linux/x86_64/sysdep.h. This macro is the 'magic glue' used to turn a normal function call into a system call.
As part of the build process of glibc, for every defined system call foo that is not in a list of special exceptions for that architecture, it generates a function __foo that contains just a single INLINE_SYSCALL macro invocation. mmap is not in the exception list for x86_64 (in sysdeps/unix/sysv/linux/x86_64/syscalls.list), so it gets the generic treatment.
How about passing "-ffreestanding" to gcc as explained in this answer?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With