[Samsung Galaxy Nexus] los93sol:
Okay, think I'm getting closer to solving this issue....from the logcat we know the function that it's dying in, and from the source I built from here it is...

The relevant information from logcat

I/DEBUG ( 127): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
I/DEBUG ( 127): Abort message: 'art/runtime/gc/space/image_space.cc:179] Check failed: GenerateImage(image_filename, &error_msg) Failed to generate image '/data/dalvik-cache/arm/system@framework@boot.art': Failed execv(/system/bin/dex2oat --image=/data/dalvik-cache/arm/system@framework@boot.art --runtime-arg -Xms64m --runtime-arg -Xmx64m --dex-file=/system/framework/core-libart.jar --dex-file=/system/framework/conscrypt.jar --dex-file=/system/framework/okhttp.jar --dex-file=/system/framework/core-junit.jar --dex-file=/sys

Here are the relevant functions from source

ImageSpace* ImageSpace::Create(const char* image_location,
const InstructionSet image_isa) {
std::string image_filename;
std::string error_msg;
bool is_system = false;
const bool found_image = FindImageFilename(image_location, image_isa, &image_filename,
&is_system);
// Note that we must not use the file descriptor associated with
// ScopedFlock::GetFile to Init the image file. We want the file
// descriptor (and the associated exclusive lock) to be released when
// we leave Create.
ScopedFlock image_lock;
image_lock.Init(image_filename.c_str(), &error_msg);
if (found_image) {
ImageSpace* space = ImageSpace::Init(image_filename.c_str(), image_location, !is_system,
&error_msg);
if (space != nullptr) {
return space;
}
// If the /system file exists, it should be up-to-date, don't try to generate it.
// If it's not the /system file, log a warning and fall through to GenerateImage.
if (is_system) {
LOG(FATAL) << "Failed to load image '" << image_filename << "': " << error_msg;
return nullptr;
} else {
LOG(WARNING) << error_msg;
}
}
CHECK(GenerateImage(image_filename, &error_msg))
<< "Failed to generate image '" << image_filename << "': " << error_msg;
ImageSpace* space = ImageSpace::Init(image_filename.c_str(), image_location, true, &error_msg);
if (space == nullptr) {
LOG(FATAL) << "Failed to load image '" << image_filename << "': " << error_msg;
}
return space;
}

static bool GenerateImage(const std::string& image_filename, std::string* error_msg) {
const std::string boot_class_path_string(Runtime::Current()->GetBootClassPathString());
std::vector<std::string> boot_class_path;
Split(boot_class_path_string, ':', boot_class_path);
if (boot_class_path.empty()) {
*error_msg = "Failed to generate image because no boot class path specified";
return false;
}
std::vector<std::string> arg_vector;
std::string dex2oat(Runtime::Current()->GetCompilerExecutable());
arg_vector.push_back(dex2oat);
std::string image_option_string("--image=");
image_option_string += image_filename;
arg_vector.push_back(image_option_string);
arg_vector.push_back("--runtime-arg");
arg_vector.push_back("-Xms64m");
arg_vector.push_back("--runtime-arg");
arg_vector.push_back("-Xmx64m");
for (size_t i = 0; i < boot_class_path.size(); i++) {
arg_vector.push_back(std::string("--dex-file=") + boot_class_path[i]);
}
std::string oat_file_option_string("--oat-file=");
oat_file_option_string += image_filename;
oat_file_option_string.erase(oat_file_option_string.size() - 3);
oat_file_option_string += "oat";
arg_vector.push_back(oat_file_option_string);
Runtime::Current()->AddCurrentRuntimeFeaturesAsDex2OatArguments(&arg_vector);
arg_vector.push_back(StringPrintf("--base=0x%x", ART_BASE_ADDRESS));
if (kIsTargetBuild) {
arg_vector.push_back("--image-classes-zip=/system/framework/framework.jar");
arg_vector.push_back("--image-classes=preloaded-classes");
} else {
arg_vector.push_back("--host");
}
const std::vector<std::string>& compiler_options = Runtime::Current()->GetImageCompilerOptions();
for (size_t i = 0; i < compiler_options.size(); ++i) {
arg_vector.push_back(compiler_options[i].c_str());
}
std::string command_line(Join(arg_vector, ' '));
LOG(INFO) << "GenerateImage: " << command_line;
return Exec(arg_vector, error_msg);
}

The specific lines in source we are hitting...

FROM THE CREATE FUNCTION...
CHECK(GenerateImage(image_filename, &error_msg))
<< "Failed to generate image '" << image_filename << "': " << error_msg;

FROM THE GENERATEIMAGE FUNCTION...
static bool GenerateImage(const std::string& image_filename, std::string* error_msg) {
const std::string boot_class_path_string(Runtime::Current()->GetBootClassPathString());
std::vector<std::string> boot_class_path;
Split(boot_class_path_string, ':', boot_class_path);
if (boot_class_path.empty()) {
*error_msg = "Failed to generate image because no boot class path specified";
return false;
}

Okay, so that's a start, now at least we know that it's failing because the boot class path wasn't specified, so let's dig deeper. We see a pointer back to the GetBootClassPathString function, let's poke around and see if we can find that in the source next to determine how it gets initialized...

Found it in runtime.h...

const std::string& GetBootClassPathString() const {
return boot_class_path_string_;
}

Well that's cool, we just need to look for boot_class_path_string_ and see where and how it gets set now.

Found it in runtime.cc...

boot_class_path_string_ = options->boot_class_path_string_;

Imagine that, another pointer to chase after, no real surprise there, I'd imagine the boot class path is probably one of the very first items to get initialized so it would make sense it just gets references passed through the entire runtime. Let's chase this guy down now...

Found a few times it's set in parse_options.cc, both of these are from the Parse function...

bool ParsedOptions::Parse(const Runtime::eek:ptions& options, bool ignore_unrecognized) {
const char* boot_class_path_string = getenv("BOOTCLASSPATH");
if (boot_class_path_string != NULL) {
boot_class_path_string_ = boot_class_path_string;
}

AND

for (size_t i = 0; i < options.size(); ++i) {
const std::string option(options[i].first);
if (StartsWith(option, "-help")) {
Usage(nullptr);
return false;
} else if (StartsWith(option, "-showversion")) {
UsageMessage(stdout, "ART version %s\n", Runtime::GetVersion());
Exit(0);
} else if (StartsWith(option, "-Xbootclasspath:")) {
boot_class_path_string_ = option.substr(strlen("-Xbootclasspath:")).data();
}

Alright...that was a helpful little excercise, now we know that if the runtime is called with the -Xbootclasspath argument it will be loaded from there. We also know that it will initially be set to whatever getenv() does, I assume that comes from init.environ.rc in the ramdisk, but I'm getting tired of chasing this one so I may leave that for someone else to validate :)

BEGIN POST EDIT #1:

I just can't leave well enough alone...

We also have the following from the logcat which shows us what options the runtime was called with...

D/AndroidRuntime( 136): >>>>>> AndroidRuntime START com.android.internal.os.ZygoteInit <<<<<<
D/AndroidRuntime( 136): CheckJNI is OFF
I/art ( 136): option[0]=-Xzygote
I/art ( 136): option[1]=exit
I/art ( 136): option[2]=vfprintf
I/art ( 136): option[3]=sensitiveThread
I/art ( 136): option[4]=-verbose:gc
I/art ( 136): option[5]=-Xms8m
I/art ( 136): option[6]=-Xmx256m
I/art ( 136): option[7]=-XX:mainThreadStackSize=24K
I/art ( 136): option[8]=-XX:HeapGrowthLimit=96m
I/art ( 136): option[9]=-XX:HeapMinFree=512k
I/art ( 136): option[10]=-XX:HeapMaxFree=8m
I/art ( 136): option[11]=-XX:HeapTargetUtilization=0.75
I/art ( 136): option[12]=-Xgenregmap
I/art ( 136): option[13]=-Xgc:precise
I/art ( 136): option[14]=-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y
I/art ( 136): option[15]=-Xlockprofthreshold:500
I/art ( 136): option[16]=-Xstacktracefile:/data/anr/traces.txt
I/art ( 136): option[17]=-Duser.language=en
I/art ( 136): option[18]=-Duser.region=US

Remember, we have not been able to use libandroid_runtime.so from L because the source in l preview branch is not the same as the preview images that were released and there seems to be a cross-compilation issue with the library causing Illegal Instruction errors. What I'd be curious to see is what options the runtime is called with from the logcat of a device that is booting up with L, anyone that can supply that?

EDIT:

Just verified that BOOTCLASSPATH is set correctly, I see one other error that needs to be chased down...

E/dex2oat ( 308): Failed to create list of image classes from 'preloaded-classes': Failed to find 'preloaded-classes' within '/system/framework/framework.jar': Entry not found