I say that because if you strip or pack the binary, instead of working it shows the output of running dart with no arguments.
I say that because if you strip or pack the binary, instead of working it shows the output of running dart with no arguments.
It depends on how you run. Dart can either run in JIT mode or AOT mode. In general, when you ship a production app (e.g., for Flutter), you are using AOT - i.e., it's compiling to native machine code. In this case, there is no interpretation or compilation at runtime. We still bundle a runtime for garbage collection.
$ cat a.dart
void main() {
print("hello world");
}
$ dart compile exe a.dart
Info: Compiling with sound null safety
Generated: /home/x/a.exe
~ $ strip a.exe
~ $ ./a.exe --version
Dart SDK version: 2.12.0 (stable) (Thu Feb 25 19:50:53
2021 +0100) on "linux_x64"
If I run without --version, it prints the same thing the 'dart' command does.https://github.com/dart-lang/sdk/issues/45197
It is AOT though. If you time `dart a.dart` vs `./a.exe` (pre strip :-), the latter should be considerably faster.
`dart2native` just concatenates two binaries together: AOT runtime binary and AOT snapshot binary. AOT snapshot is an ELF binary which contains native code generated from your original Dart code.
The approach is not pretty but was chosen as an implementation shortcut.
That's why `strip` does not actually do good things to the binary.
There is no reason to run `strip` on such binaries - because they don't contain anything strippable.
I didn't inspect the binaries, just try to see how/if they compress.