Remove CRT (C's runtime) from betterC binaries?

Mike Franklin slavo5150 at yahoo.com
Tue Aug 14 13:39:59 UTC 2018


On Tuesday, 14 August 2018 at 13:11:57 UTC, Rel wrote:
> Can I or is it even possible to remove the CRT (C's runtime 
> library) completely from my executables compiled with betterC 
> flag?

-betterC currently expects the C standard library, and 
consequently the C runtime.  Under the hood DMD calls `gcc` to do 
the linking.  `gcc` automatically links in the C standard library 
and the C runtime.

You could potentially use the `-L` flag to pass `-nostdlibs`, 
`-nodefaultlibs`, `-nostartfiles`, and friends, but I don't know 
if it will work.  If you don't want the C runtime or the C 
standard library the best thing might just be to link separately 
with a direct invocation of `ld`.

There are other ways to do minimalist programming in D without 
-betterC. See 
https://dlang.org/changelog/2.079.0.html#minimal_runtime

The following is an illustration:

---object.d
module object;

alias immutable(char)[] string;

private long __d_sys_write(long arg1, in void* arg2, long arg3)
{
     long result;

     asm
     {
         mov RAX, 1;
         mov RDI, arg1;
         mov RSI, arg2;
         mov RDX, arg3;
         syscall;
     }

     return result;
}

void write(string text)
{
     __d_sys_write(2, text.ptr, text.length);
}

private void __d_sys_exit(long arg1)
{
     asm
     {
         mov RAX, 60;
         mov RDI, arg1;
         syscall;
     }
}

extern void main();
private extern(C) void _start()
{
     main();
     __d_sys_exit(0);
}

---main.d
module main;

void main()
{
     write("Hello, World\n");
}

# On a 64-bit Linux host
$dmd -c -lib -conf= object.d main.d -of=main.o  (Note: no 
-betterC)
$ld main.o -o main
$size main
    text    data     bss     dec     hex filename
     176       0       0     176      b0 main
$main
Hello, World

Mike


More information about the Digitalmars-d mailing list