Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(926)

Unified Diff: src/tools/validator_tools/ncstubout.c

Issue 636933004: stop building/testing old x86 validator. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: rebase master Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/tools/validator_tools/build.scons ('k') | src/trusted/service_runtime/arch/x86/service_runtime_x86.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/tools/validator_tools/ncstubout.c
diff --git a/src/tools/validator_tools/ncstubout.c b/src/tools/validator_tools/ncstubout.c
deleted file mode 100644
index 4ad98ab35b1e40b24e6ab10f26d5d48440a32578..0000000000000000000000000000000000000000
--- a/src/tools/validator_tools/ncstubout.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (c) 2012 The Native Client Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * This tool rewrites ELF files to replace instructions that will be
- * rejected by the validator with safe HLT instructions. This is
- * useful if you have a large library in which many functions do not
- * validate but are not immediately required to work. Replacing the
- * forbidden instructions with HLTs makes it easier to find the
- * instructions that are needed first, and fix and test them.
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "native_client/src/include/elf.h"
-#include "native_client/src/shared/gio/gio.h"
-#include "native_client/src/shared/platform/nacl_check.h"
-#include "native_client/src/shared/utils/types.h"
-#include "native_client/src/trusted/validator/ncvalidate.h"
-
-static Bool FixUpSectionCheckStatus(NaClValidationStatus status) {
- switch (status) {
- case NaClValidationSucceeded:
- return TRUE;
- default:
- case NaClValidationFailed:
- fprintf(stderr, "Errors still exist after attempting to stubout code\n");
- return FALSE;
- case NaClValidationFailedOutOfMemory:
- fprintf(stderr, "Unable to stubout code, not enough memory\n");
- return FALSE;
- case NaClValidationFailedNotImplemented:
- fprintf(stderr, "Unable to stubout code, not implemented\n");
- return FALSE;
- case NaClValidationFailedCpuNotSupported:
- /* This shouldn't happen, but if it does, report the problem. */
- fprintf(stderr, "Unable to stubout code, cpu not supported\n");
- return FALSE;
- case NaClValidationFailedSegmentationIssue:
- fprintf(stderr, "Unable to stubout code, segmentation issues found\n");
- return FALSE;
- }
- return FALSE;
-}
-
-static Bool FixUpSection(const struct NaClValidatorInterface *validator,
- uintptr_t load_address,
- unsigned char *code,
- size_t code_size) {
- Bool result;
- NaClValidationStatus status;
- NaClCPUFeatures *cpu_features = malloc(validator->CPUFeatureSize);
- if (cpu_features == NULL) {
- fprintf(stderr, "Unable to create memory for CPU features\n");
- return FALSE;
- }
- /* Pretend that the CPU supports every feature so that we will only stub out
- * instructions that NaCl will never allow under any condition.
- */
- validator->SetAllCPUFeatures(cpu_features);
-
- status = validator->Validate(
- load_address, code, code_size,
- /* stubout_mode= */ TRUE,
- /* readonly_text= */ FALSE,
- cpu_features,
- /* metadata= */ NULL,
- /* cache= */ NULL);
- if (status == NaClValidationSucceeded) {
- /* Now run the validator again, so that we report any errors
- * that were not fixed by stubbing out. This is done so that
- * the user knows that stubout doesn't fix all errors.
- */
- status = NACL_SUBARCH_NAME(ApplyValidatorVerbosely,
- NACL_TARGET_ARCH,
- NACL_TARGET_SUBARCH)
- (load_address, code, code_size, cpu_features);
- }
-
- result = FixUpSectionCheckStatus(status);
- free(cpu_features);
- return result;
-}
-
-static void CheckBounds(unsigned char *data, size_t data_size,
- void *ptr, size_t inside_size) {
- CHECK(data <= (unsigned char *) ptr);
- CHECK((unsigned char *) ptr + inside_size <= data + data_size);
-}
-
-static Bool FixUpELF32(const struct NaClValidatorInterface *validator,
- unsigned char *data,
- size_t data_size) {
- Elf32_Ehdr *header;
- int index;
- Bool fixed = TRUE; /* until proven otherwise. */
-
- header = (Elf32_Ehdr *) data;
- CheckBounds(data, data_size, header, sizeof(*header));
- CHECK(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0);
-
- for (index = 0; index < header->e_shnum; index++) {
- Elf32_Shdr *section = (Elf32_Shdr *) (data + header->e_shoff +
- header->e_shentsize * index);
- CheckBounds(data, data_size, section, sizeof(*section));
-
- if ((section->sh_flags & SHF_EXECINSTR) != 0) {
- CheckBounds(data, data_size,
- data + section->sh_offset, section->sh_size);
- if (!FixUpSection(validator,
- section->sh_addr,
- data + section->sh_offset,
- section->sh_size)) {
- fixed = FALSE;
- }
- }
- }
- return fixed;
-}
-
-#if NACL_TARGET_SUBARCH == 64
-static Bool FixUpELF64(const struct NaClValidatorInterface *validator,
- unsigned char *data,
- size_t data_size) {
- Elf64_Ehdr *header;
- int index;
- Bool fixed = TRUE; /* until proven otherwise. */
-
- header = (Elf64_Ehdr *) data;
- CheckBounds(data, data_size, header, sizeof(*header));
- CHECK(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0);
-
- for (index = 0; index < header->e_shnum; index++) {
- Elf64_Shdr *section = (Elf64_Shdr *) (data + header->e_shoff +
- header->e_shentsize * index);
- CheckBounds(data, data_size, section, sizeof(*section));
-
- if ((section->sh_flags & SHF_EXECINSTR) != 0) {
- CheckBounds(data, data_size,
- data + section->sh_offset, section->sh_size);
- if (!FixUpSection(validator,
- section->sh_addr,
- data + section->sh_offset,
- section->sh_size)) {
- fixed = FALSE;
- }
- }
- }
- return fixed;
-}
-#endif
-
-static Bool FixUpELF(const struct NaClValidatorInterface *validator,
- unsigned char *data,
- size_t data_size) {
-#if NACL_TARGET_SUBARCH == 64
- if (data_size > EI_CLASS && data[EI_CLASS] == ELFCLASS64)
- return FixUpELF64(validator, data, data_size);
-#endif
- return FixUpELF32(validator, data, data_size);
-}
-
-static Bool FixUpELFFile(const struct NaClValidatorInterface *validator,
- const char *input_file,
- const char *output_file) {
- FILE *fp;
- size_t file_size;
- unsigned char *data;
- size_t got;
- size_t written;
-
- /* Read whole ELF file and write it back with modifications. */
- fp = fopen(input_file, "rb");
- if (fp == NULL) {
- fprintf(stderr, "Failed to open input file: %s\n", input_file);
- return FALSE;
- }
- /* Find the file size. */
- fseek(fp, 0, SEEK_END);
- file_size = ftell(fp);
- data = malloc(file_size);
- if (data == NULL) {
- fprintf(stderr, "Unable to create memory imate of input file: %s\n",
- input_file);
- return FALSE;
- }
- fseek(fp, 0, SEEK_SET);
- got = fread(data, 1, file_size, fp);
- if (got != file_size) {
- fprintf(stderr, "Unable to read data from input file: %s\n",
- input_file);
- return FALSE;
- }
- fclose(fp);
-
- if (!FixUpELF(validator, data, file_size)) return FALSE;
-
- fp = fopen(output_file, "wb");
- if (fp == NULL) {
- fprintf(stderr, "Failed to open output file: %s\n", output_file);
- return FALSE;
- }
- written = fwrite(data, 1, file_size, fp);
- if (written != file_size) {
- fprintf(stderr, "Unable to write data to output file: %s\n",
- output_file);
- return FALSE;
- }
- fclose(fp);
- return TRUE;
-}
-
-int main(int argc, const char *argv[]) {
- /* Be sure to redirect validator error messages to stderr. */
- const struct NaClValidatorInterface *validator;
- NaClLogModuleInit();
- validator = NaClCreateValidator();
- if (!validator->stubout_mode_implemented) {
- fprintf(stderr,
- "This platform does not support stubout mode.");
- return 1;
- }
- if (argc != 4 || strcmp(argv[2], "-o") != 0) {
- fprintf(stderr, "Usage: %s <input-file> -o <output-file>\n\n", argv[0]);
- fprintf(stderr,
- "This tool rewrites ELF objects to replace instructions that are\n"
- "rejected by the NaCl validator with safe HLT instructions.\n");
- return 1;
- }
- return FixUpELFFile(validator, argv[1], argv[3]) ? 0 : 1;
-}
« no previous file with comments | « src/tools/validator_tools/build.scons ('k') | src/trusted/service_runtime/arch/x86/service_runtime_x86.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698