commit | b0c4ddf9196738d9c8a162521b61bcefb7aa4c0a | [log] [tgz] |
---|---|---|
author | Tess Strickland <sstrickl@google.com> | Thu Sep 29 08:32:47 2022 +0000 |
committer | Commit Queue <dart-scoped@luci-project-accounts.iam.gserviceaccount.com> | Thu Sep 29 08:32:47 2022 +0000 |
tree | 9ff82fb0ea0818f98c1e889ca68f0ec1cb90a6a8 | |
parent | a2466e26c53331511b73258c2c890c61484ae8c8 [diff] |
[pkg/dart2native] Avoid overwriting section contents in MachO files. To create a Dart standalone executable on MacOS, we modify the dartaotruntime executable to add the snapshot contents, and the VM looks into the executable on disk to find the snapshot to load. Previously, we did this by adding a new 64-bit segment load command with a single section, where the section's file offset and size describes the inserted snapshot. This meant the Mach-O header size increased by 152 bytes. Originally, this wasn't an issue as there was plenty of padding, but later clang updates removed most of this padding, and so writing the new header actually overwrote the initial contents of the first section in the file, which happens to be the __text section. In addition, since the first section's offset was now declared to be within the header, utilities that strictly validated the Mach-O format, like codesign, would report errors. This CL changes it so that we actually reserve space in the dartaotruntime header using the -add_empty_section flag to the linker. In addition, we change from using a segment load command to using a (40 byte) note load command. This is because a segment load command specifies that the contents should be loaded in memory, but we don't use that loaded version. Instead, the VM reloads it from the executable on disk so it can appropriately mmap the different parts of the snapshot. A note section instead just declares a section of the executable as arbitrary data that the owner can read from the file and use as desired, which is semantically closer to our current usage. This CL also adds a test to pkg/dartdev/test/commands/compile_test to ensure that corrupting a random part of the snapshot in the executable causes signature verification to fail. This CL also reverts CL 256208, thus relanding the clang changes starting from June that originally raised awareness of the issue by greatly reduced the amount of padding after the load commands. TEST=pkg/dartdev/test/commands/compile_test Bug: https://github.com/dart-lang/sdk/issues/49783 Change-Id: Iee554d87b0eabaecd7a534ca4e4facfefbce6385 Cq-Include-Trybots: luci.dart.try:analyzer-mac-release-try,dart-sdk-mac-arm64-try,dart-sdk-mac-try,pkg-mac-release-arm64-try,pkg-mac-release-try,vm-kernel-precomp-mac-product-x64-try,vm-kernel-precomp-nnbd-mac-release-arm64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/260108 Reviewed-by: Ryan Macnak <rmacnak@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com>
Dart is:
Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.
Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.