elf_writer_quick.cc revision 50cfe74daaece80853cb3b45d4338329b7d0345b
16a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom/* 26a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * Copyright (C) 2012 The Android Open Source Project 36a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * 46a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 56a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * you may not use this file except in compliance with the License. 66a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * You may obtain a copy of the License at 76a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * 86a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 96a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * 106a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * Unless required by applicable law or agreed to in writing, software 116a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 126a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * See the License for the specific language governing permissions and 146a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom * limitations under the License. 156a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom */ 166a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 176a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include "elf_writer_quick.h" 186a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 196a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include "base/logging.h" 206a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include "base/unix_file/fd_file.h" 21c6dfdacea2fd9e268f70328805b0366cdd6b7b9eBrian Carlstrom#include "buffered_output_stream.h" 227940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "driver/compiler_driver.h" 2350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray#include "elf_utils.h" 24c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom#include "file_output_stream.h" 256a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include "globals.h" 266a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include "oat.h" 27c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom#include "oat_writer.h" 286a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include "utils.h" 296a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 306a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstromnamespace art { 316a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 326a47b9dc850b903aabefcfab4adb132cb68bba2eBrian CarlstromElfWriterQuick::ElfWriterQuick(const CompilerDriver& driver, File* elf_file) 336a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom : ElfWriter(driver, elf_file) {} 346a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 356a47b9dc850b903aabefcfab4adb132cb68bba2eBrian CarlstromElfWriterQuick::~ElfWriterQuick() {} 366a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 376a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrombool ElfWriterQuick::Create(File* elf_file, 38c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom OatWriter& oat_writer, 396a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const std::vector<const DexFile*>& dex_files, 406a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const std::string& android_root, 416a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom bool is_host, 426a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const CompilerDriver& driver) { 436a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom ElfWriterQuick elf_writer(driver, elf_file); 44c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom return elf_writer.Write(oat_writer, dex_files, android_root, is_host); 456a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom} 466a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 47c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrombool ElfWriterQuick::Write(OatWriter& oat_writer, 486a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const std::vector<const DexFile*>& dex_files_unused, 496a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const std::string& android_root_unused, 506a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom bool is_host_unused) { 516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const bool debug = false; 526a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 536a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Ehdr | 546a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 556a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Phdr PHDR | 566a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Phdr LOAD R | .dynsym .dynstr .hash .rodata 576a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Phdr LOAD R X | .text 586a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Phdr LOAD RW | .dynamic 596a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Phdr DYNAMIC | .dynamic 606a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 616a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .dynsym | 626a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Sym STN_UNDEF | 636a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Sym oatdata | 646a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Sym oatexec | 656a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Sym oatlastword | 666a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 676a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .dynstr | 686a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | \0 | 696a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | oatdata\0 | 706a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | oatexec\0 | 716a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | oatlastword\0 | 726a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | boot.oat\0 | 736a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 746a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .hash | 756a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Word nbucket = 1 | 766a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Word nchain = 3 | 776a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Word bucket[0] = 0| 786a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Word chain[0] = 1| 796a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Word chain[1] = 2| 806a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Word chain[2] = 3| 816a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 826a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .rodata | 836a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | oatdata..oatexec-4 | 846a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 856a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .text | 866a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | oatexec..oatlastword | 876a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 886a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .dynamic | 896a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Dyn DT_SONAME | 906a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Dyn DT_HASH | 916a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Dyn DT_SYMTAB | 926a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Dyn DT_SYMENT | 936a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Dyn DT_STRTAB | 946a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Dyn DT_STRSZ | 956a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Dyn DT_NULL | 966a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 976a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .shstrtab | 986a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | \0 | 996a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .dynamic\0 | 1006a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .dynsym\0 | 1016a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .dynstr\0 | 1026a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .hash\0 | 1036a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .rodata\0 | 1046a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .text\0 | 1056a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | .shstrtab\0 | 1066a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 1076a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr NULL | 1086a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr .dynsym | 1096a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr .dynstr | 1106a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr .hash | 1116a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr .text | 1126a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr .rodata | 1136a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr .dynamic | 1146a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // | Elf32_Shdr .shstrtab | 1156a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // +-------------------------+ 1166a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 1176a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // phase 1: computing offsets 1186a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t expected_offset = 0; 1196a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 1206a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // Elf32_Ehdr 12150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray expected_offset += sizeof(Elf32_Ehdr); 1226a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 1236a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // PHDR 12450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t phdr_alignment = sizeof(Elf32_Word); 1256a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t phdr_offset = expected_offset; 1266a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t PH_PHDR = 0; 1276a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t PH_LOAD_R__ = 1; 1286a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t PH_LOAD_R_X = 2; 1296a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t PH_LOAD_RW_ = 3; 1306a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t PH_DYNAMIC = 4; 1316a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t PH_NUM = 5; 13250cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t phdr_size = sizeof(Elf32_Phdr) * PH_NUM; 1336a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += phdr_size; 1346a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 1356a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "phdr_offset=" << phdr_offset << std::hex << " " << phdr_offset; 1366a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "phdr_size=" << phdr_size << std::hex << " " << phdr_size; 1376a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 1386a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 1396a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynsym 14050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t dynsym_alignment = sizeof(Elf32_Word); 1416a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynsym_offset = expected_offset = RoundUp(expected_offset, dynsym_alignment); 1427934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom const uint8_t SYM_UNDEF = 0; // aka STN_UNDEF 1436a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SYM_OATDATA = 1; 1446a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SYM_OATEXEC = 2; 1456a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SYM_OATLASTWORD = 3; 1466a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SYM_NUM = 4; 14750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t dynsym_size = sizeof(Elf32_Sym) * SYM_NUM; 1486a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += dynsym_size; 1496a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 1506a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "dynsym_offset=" << dynsym_offset << std::hex << " " << dynsym_offset; 1516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "dynsym_size=" << dynsym_size << std::hex << " " << dynsym_size; 1526a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 1536a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 1546a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynstr 1556a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynstr_alignment = 1; 1566a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynstr_offset = expected_offset = RoundUp(expected_offset, dynstr_alignment); 1576a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom std::string dynstr; 1586a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += '\0'; 1596a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynstr_oatdata_offset = dynstr.size(); 1606a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += "oatdata"; 1616a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += '\0'; 1626a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynstr_oatexec_offset = dynstr.size(); 1636a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += "oatexec"; 1646a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += '\0'; 1656a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynstr_oatlastword_offset = dynstr.size(); 1666a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += "oatlastword"; 1676a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += '\0'; 1686a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynstr_soname_offset = dynstr.size(); 1696a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom std::string file_name(elf_file_->GetPath()); 1706a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom size_t directory_separator_pos = file_name.rfind('/'); 1716a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (directory_separator_pos != std::string::npos) { 1726a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom file_name = file_name.substr(directory_separator_pos + 1); 1736a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 1746a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += file_name; 1756a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynstr += '\0'; 1766a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynstr_size = dynstr.size(); 1776a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += dynstr_size; 1786a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 1796a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "dynstr_offset=" << dynstr_offset << std::hex << " " << dynstr_offset; 1806a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "dynstr_size=" << dynstr_size << std::hex << " " << dynstr_size; 1816a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 1826a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 1836a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .hash 18450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t hash_alignment = sizeof(Elf32_Word); // Even for 64-bit 1856a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t hash_offset = expected_offset = RoundUp(expected_offset, hash_alignment); 1866a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t HASH_NBUCKET = 0; 1876a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t HASH_NCHAIN = 1; 1886a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t HASH_BUCKET0 = 2; 1896a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t HASH_NUM = HASH_BUCKET0 + 1 + SYM_NUM; 19050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t hash_size = sizeof(Elf32_Word) * HASH_NUM; 1916a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += hash_size; 1926a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 1936a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "hash_offset=" << hash_offset << std::hex << " " << hash_offset; 1946a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "hash_size=" << hash_size << std::hex << " " << hash_size; 1956a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 1966a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 1976a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .rodata 1986a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t oat_data_alignment = kPageSize; 1996a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t oat_data_offset = expected_offset = RoundUp(expected_offset, oat_data_alignment); 200c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom const OatHeader& oat_header = oat_writer.GetOatHeader(); 201c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom CHECK(oat_header.IsValid()); 202c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom uint32_t oat_data_size = oat_header.GetExecutableOffset(); 2036a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += oat_data_size; 2046a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 2056a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "oat_data_offset=" << oat_data_offset << std::hex << " " << oat_data_offset; 2066a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "oat_data_size=" << oat_data_size << std::hex << " " << oat_data_size; 2076a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 2086a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 2096a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .text 2106a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t oat_exec_alignment = kPageSize; 2116a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom CHECK_ALIGNED(expected_offset, kPageSize); 2126a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t oat_exec_offset = expected_offset = RoundUp(expected_offset, oat_exec_alignment); 213c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom uint32_t oat_exec_size = oat_writer.GetSize() - oat_data_size; 2146a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += oat_exec_size; 215c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom CHECK_EQ(oat_data_offset + oat_writer.GetSize(), expected_offset); 2166a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 2176a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "oat_exec_offset=" << oat_exec_offset << std::hex << " " << oat_exec_offset; 2186a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "oat_exec_size=" << oat_exec_size << std::hex << " " << oat_exec_size; 2196a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 2206a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 2216a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynamic 22250cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray // alignment would naturally be sizeof(Elf32_Word), but we want this in a new segment 2236a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynamic_alignment = kPageSize; 2246a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t dynamic_offset = expected_offset = RoundUp(expected_offset, dynamic_alignment); 2256a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_SONAME = 0; 2266a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_HASH = 1; 2276a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_SYMTAB = 2; 2286a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_SYMENT = 3; 2296a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_STRTAB = 4; 2306a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_STRSZ = 5; 2316a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_NULL = 6; 2326a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t DH_NUM = 7; 23350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t dynamic_size = sizeof(Elf32_Dyn) * DH_NUM; 2346a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += dynamic_size; 2356a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 2366a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "dynamic_offset=" << dynamic_offset << std::hex << " " << dynamic_offset; 2376a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "dynamic_size=" << dynamic_size << std::hex << " " << dynamic_size; 2386a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 2396a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 2406a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .shstrtab 2416a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_alignment = 1; 2426a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_offset = expected_offset = RoundUp(expected_offset, shstrtab_alignment); 2436a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom std::string shstrtab; 2446a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2456a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_dynamic_offset = shstrtab.size(); 2466a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom CHECK_EQ(1U, shstrtab_dynamic_offset); 2476a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += ".dynamic"; 2486a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2496a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_dynsym_offset = shstrtab.size(); 2506a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += ".dynsym"; 2516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2526a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_dynstr_offset = shstrtab.size(); 2536a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += ".dynstr"; 2546a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2556a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_hash_offset = shstrtab.size(); 2566a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += ".hash"; 2576a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2586a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_rodata_offset = shstrtab.size(); 2596a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += ".rodata"; 2606a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2616a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_text_offset = shstrtab.size(); 2626a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += ".text"; 2636a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2646a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_shstrtab_offset = shstrtab.size(); 2656a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += ".shstrtab"; 2666a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom shstrtab += '\0'; 2676a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shstrtab_size = shstrtab.size(); 2686a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += shstrtab_size; 2696a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 2706a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "shstrtab_offset=" << shstrtab_offset << std::hex << " " << shstrtab_offset; 2716a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "shstrtab_size=" << shstrtab_size << std::hex << " " << shstrtab_size; 2726a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 2736a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 2746a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // section headers (after all sections) 27550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t shdr_alignment = sizeof(Elf32_Word); 2766a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom uint32_t shdr_offset = expected_offset = RoundUp(expected_offset, shdr_alignment); 2776a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_NULL = 0; 2786a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_DYNSYM = 1; 2796a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_DYNSTR = 2; 2806a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_HASH = 3; 2816a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_RODATA = 4; 2826a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_TEXT = 5; 2836a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_DYNAMIC = 6; 2846a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_SHSTRTAB = 7; 2856a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom const uint8_t SH_NUM = 8; 28650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray uint32_t shdr_size = sizeof(Elf32_Shdr) * SH_NUM; 2876a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom expected_offset += shdr_size; 2886a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (debug) { 2896a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "shdr_offset=" << shdr_offset << std::hex << " " << shdr_offset; 2906a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(INFO) << "shdr_size=" << shdr_size << std::hex << " " << shdr_size; 2916a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 2926a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 2936a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // phase 2: initializing data 2946a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 2956a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // Elf32_Ehdr 29650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray Elf32_Ehdr elf_header; 2976a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom memset(&elf_header, 0, sizeof(elf_header)); 29850cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_MAG0] = ELFMAG0; 29950cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_MAG1] = ELFMAG1; 30050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_MAG2] = ELFMAG2; 30150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_MAG3] = ELFMAG3; 30250cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_CLASS] = ELFCLASS32; 30350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_DATA] = ELFDATA2LSB; 30450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_VERSION] = EV_CURRENT; 30550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_OSABI] = ELFOSABI_LINUX; 30650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ident[EI_ABIVERSION] = 0; 30750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_type = ET_DYN; 3086a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom switch (compiler_driver_->GetInstructionSet()) { 3096a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom case kThumb2: { 31050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_machine = EM_ARM; 31150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_flags = EF_ARM_EABI_VER5; 3126a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom break; 3136a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 3146a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom case kX86: { 31550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_machine = EM_386; 3166a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_flags = 0; 3176a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom break; 3186a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 3196a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom case kMips: { 32050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_machine = EM_MIPS; 32150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_flags = (EF_MIPS_NOREORDER | 32250cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray EF_MIPS_PIC | 32350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray EF_MIPS_CPIC | 32450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray EF_MIPS_ABI_O32 | 32550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray EF_MIPS_ARCH_32R2); 3266a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom break; 3276a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 3286a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom case kArm: 3296a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom default: { 3306a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom LOG(FATAL) << "Unknown instruction set: " << compiler_driver_->GetInstructionSet(); 3316a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom break; 3326a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 3336a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 3346a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_version = 1; 3356a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_entry = 0; 3366a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_phoff = phdr_offset; 3376a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_shoff = shdr_offset; 33850cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_ehsize = sizeof(Elf32_Ehdr); 33950cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_phentsize = sizeof(Elf32_Phdr); 3406a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_phnum = PH_NUM; 34150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray elf_header.e_shentsize = sizeof(Elf32_Shdr); 3426a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_shnum = SH_NUM; 3436a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom elf_header.e_shstrndx = SH_SHSTRTAB; 3446a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 3456a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // PHDR 34650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray Elf32_Phdr program_headers[PH_NUM]; 3476a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom memset(&program_headers, 0, sizeof(program_headers)); 3486a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 34950cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_PHDR].p_type = PT_PHDR; 3506a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_PHDR].p_offset = phdr_offset; 3516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_PHDR].p_vaddr = phdr_offset; 3526a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_PHDR].p_paddr = phdr_offset; 3536a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_PHDR].p_filesz = sizeof(program_headers); 3546a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_PHDR].p_memsz = sizeof(program_headers); 35550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_PHDR].p_flags = PF_R; 3566a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_PHDR].p_align = phdr_alignment; 3576a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 35850cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_LOAD_R__].p_type = PT_LOAD; 3596a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R__].p_offset = 0; 3606a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R__].p_vaddr = 0; 3616a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R__].p_paddr = 0; 3626a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R__].p_filesz = oat_data_offset + oat_data_size; 3636a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R__].p_memsz = oat_data_offset + oat_data_size; 36450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_LOAD_R__].p_flags = PF_R; 3656a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R__].p_align = oat_data_alignment; 3666a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 36750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_LOAD_R_X].p_type = PT_LOAD; 3686a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R_X].p_offset = oat_exec_offset; 3696a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R_X].p_vaddr = oat_exec_offset; 3706a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R_X].p_paddr = oat_exec_offset; 3716a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R_X].p_filesz = oat_exec_size; 3726a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R_X].p_memsz = oat_exec_size; 37350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_LOAD_R_X].p_flags = PF_R | PF_X; 3746a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_R_X].p_align = oat_exec_alignment; 3756a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 3766a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // TODO: PF_W for DYNAMIC is considered processor specific, do we need it? 37750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_LOAD_RW_].p_type = PT_LOAD; 3786a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_RW_].p_offset = dynamic_offset; 3796a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_RW_].p_vaddr = dynamic_offset; 3806a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_RW_].p_paddr = dynamic_offset; 3816a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_RW_].p_filesz = dynamic_size; 3826a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_RW_].p_memsz = dynamic_size; 38350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_LOAD_RW_].p_flags = PF_R | PF_W; 3846a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_LOAD_RW_].p_align = dynamic_alignment; 3856a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 3866a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // TODO: PF_W for DYNAMIC is considered processor specific, do we need it? 38750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_DYNAMIC].p_type = PT_DYNAMIC; 3886a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_DYNAMIC].p_offset = dynamic_offset; 3896a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_DYNAMIC].p_vaddr = dynamic_offset; 3906a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_DYNAMIC].p_paddr = dynamic_offset; 3916a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_DYNAMIC].p_filesz = dynamic_size; 3926a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_DYNAMIC].p_memsz = dynamic_size; 39350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray program_headers[PH_DYNAMIC].p_flags = PF_R | PF_W; 3946a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom program_headers[PH_DYNAMIC].p_align = dynamic_alignment; 3956a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 3966a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynsym 39750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray Elf32_Sym dynsym[SYM_NUM]; 3986a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom memset(&dynsym, 0, sizeof(dynsym)); 3996a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4006a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_UNDEF].st_name = 0; 4016a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_UNDEF].st_value = 0; 4026a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_UNDEF].st_size = 0; 4036a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_UNDEF].st_info = 0; 4046a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_UNDEF].st_other = 0; 4056a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_UNDEF].st_shndx = 0; 4066a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4076a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATDATA].st_name = dynstr_oatdata_offset; 4086a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATDATA].st_value = oat_data_offset; 4096a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATDATA].st_size = oat_data_size; 41050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray SetBindingAndType(&dynsym[SYM_OATDATA], STB_GLOBAL, STT_OBJECT); 41150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynsym[SYM_OATDATA].st_other = STV_DEFAULT; 4126a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATDATA].st_shndx = SH_RODATA; 4136a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4146a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATEXEC].st_name = dynstr_oatexec_offset; 4156a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATEXEC].st_value = oat_exec_offset; 4166a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATEXEC].st_size = oat_exec_size; 41750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray SetBindingAndType(&dynsym[SYM_OATEXEC], STB_GLOBAL, STT_OBJECT); 41850cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynsym[SYM_OATEXEC].st_other = STV_DEFAULT; 4196a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATEXEC].st_shndx = SH_TEXT; 4206a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4216a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATLASTWORD].st_name = dynstr_oatlastword_offset; 4226a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATLASTWORD].st_value = oat_exec_offset + oat_exec_size - 4; 4236a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATLASTWORD].st_size = 4; 42450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray SetBindingAndType(&dynsym[SYM_OATLASTWORD], STB_GLOBAL, STT_OBJECT); 42550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynsym[SYM_OATLASTWORD].st_other = STV_DEFAULT; 4266a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynsym[SYM_OATLASTWORD].st_shndx = SH_TEXT; 4276a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4286a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynstr initialized above as dynstr 4296a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4306a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .hash 43150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray Elf32_Word hash[HASH_NUM]; // Note this is Elf32_Word even on 64-bit 4326a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom hash[HASH_NBUCKET] = 1; 4336a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom hash[HASH_NCHAIN] = SYM_NUM; 4346a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom hash[HASH_BUCKET0] = SYM_OATDATA; 4356a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom hash[HASH_BUCKET0 + 1 + SYM_UNDEF] = SYM_UNDEF; 4366a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom hash[HASH_BUCKET0 + 1 + SYM_OATDATA] = SYM_OATEXEC; 4376a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom hash[HASH_BUCKET0 + 1 + SYM_OATEXEC] = SYM_OATLASTWORD; 4386a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom hash[HASH_BUCKET0 + 1 + SYM_OATLASTWORD] = SYM_UNDEF; 4396a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4406a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .rodata and .text content come from oat_contents 4416a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4426a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynamic 44350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray Elf32_Dyn dynamic_headers[DH_NUM]; 4446a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom memset(&dynamic_headers, 0, sizeof(dynamic_headers)); 4456a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 44650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_SONAME].d_tag = DT_SONAME; 4476a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynamic_headers[DH_SONAME].d_un.d_val = dynstr_soname_offset; 4486a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 44950cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_HASH].d_tag = DT_HASH; 4506a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynamic_headers[DH_HASH].d_un.d_ptr = hash_offset; 4516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 45250cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_SYMTAB].d_tag = DT_SYMTAB; 4536a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynamic_headers[DH_SYMTAB].d_un.d_ptr = dynsym_offset; 4546a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 45550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_SYMENT].d_tag = DT_SYMENT; 45650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_SYMENT].d_un.d_val = sizeof(Elf32_Sym); 4576a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 45850cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_STRTAB].d_tag = DT_STRTAB; 4596a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynamic_headers[DH_STRTAB].d_un.d_ptr = dynstr_offset; 4606a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 46150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_STRSZ].d_tag = DT_STRSZ; 4626a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynamic_headers[DH_STRSZ].d_un.d_val = dynstr_size; 4636a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 46450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray dynamic_headers[DH_NULL].d_tag = DT_NULL; 4656a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom dynamic_headers[DH_NULL].d_un.d_val = 0; 4666a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4676a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .shstrtab initialized above as shstrtab 4686a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4696a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // section headers (after all sections) 47050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray Elf32_Shdr section_headers[SH_NUM]; 4716a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom memset(§ion_headers, 0, sizeof(section_headers)); 4726a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4736a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_name = 0; 47450cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_NULL].sh_type = SHT_NULL; 4756a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_flags = 0; 4766a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_addr = 0; 4776a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_offset = 0; 4786a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_size = 0; 4796a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_link = 0; 4806a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_info = 0; 4816a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_addralign = 0; 4826a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_NULL].sh_entsize = 0; 4836a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4846a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSYM].sh_name = shstrtab_dynsym_offset; 48550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNSYM].sh_type = SHT_DYNSYM; 48650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNSYM].sh_flags = SHF_ALLOC; 4876a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSYM].sh_addr = dynsym_offset; 4886a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSYM].sh_offset = dynsym_offset; 4896a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSYM].sh_size = dynsym_size; 4906a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSYM].sh_link = SH_DYNSTR; 4916a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSYM].sh_info = 1; // 1 because we have not STB_LOCAL symbols 4926a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSYM].sh_addralign = dynsym_alignment; 49350cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNSYM].sh_entsize = sizeof(Elf32_Sym); 4946a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 4956a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_name = shstrtab_dynstr_offset; 49650cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNSTR].sh_type = SHT_STRTAB; 49750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNSTR].sh_flags = SHF_ALLOC; 4986a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_addr = dynstr_offset; 4996a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_offset = dynstr_offset; 5006a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_size = dynstr_size; 5016a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_link = 0; 5026a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_info = 0; 5036a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_addralign = dynstr_alignment; 5046a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNSTR].sh_entsize = 0; 5056a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5066a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_HASH].sh_name = shstrtab_hash_offset; 50750cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_HASH].sh_type = SHT_HASH; 50850cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_HASH].sh_flags = SHF_ALLOC; 5096a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_HASH].sh_addr = hash_offset; 5106a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_HASH].sh_offset = hash_offset; 5116a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_HASH].sh_size = hash_size; 5126a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_HASH].sh_link = SH_DYNSYM; 5136a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_HASH].sh_info = 0; 5146a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_HASH].sh_addralign = hash_alignment; 51550cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_HASH].sh_entsize = sizeof(Elf32_Word); // This is Elf32_Word even on 64-bit 5166a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5176a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_name = shstrtab_rodata_offset; 51850cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_RODATA].sh_type = SHT_PROGBITS; 51950cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_RODATA].sh_flags = SHF_ALLOC; 5206a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_addr = oat_data_offset; 5216a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_offset = oat_data_offset; 5226a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_size = oat_data_size; 5236a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_link = 0; 5246a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_info = 0; 5256a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_addralign = oat_data_alignment; 5266a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_RODATA].sh_entsize = 0; 5276a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5286a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_name = shstrtab_text_offset; 52950cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_TEXT].sh_type = SHT_PROGBITS; 53050cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_TEXT].sh_flags = SHF_ALLOC | SHF_EXECINSTR; 5316a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_addr = oat_exec_offset; 5326a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_offset = oat_exec_offset; 5336a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_size = oat_exec_size; 5346a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_link = 0; 5356a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_info = 0; 5366a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_addralign = oat_exec_alignment; 5376a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_TEXT].sh_entsize = 0; 5386a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5396a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // TODO: SHF_WRITE for .dynamic is considered processor specific, do we need it? 5406a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNAMIC].sh_name = shstrtab_dynamic_offset; 54150cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNAMIC].sh_type = SHT_DYNAMIC; 54250cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNAMIC].sh_flags = SHF_WRITE | SHF_ALLOC; 5436a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNAMIC].sh_addr = dynamic_offset; 5446a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNAMIC].sh_offset = dynamic_offset; 5456a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNAMIC].sh_size = dynamic_size; 5466a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNAMIC].sh_link = SH_DYNSTR; 5476a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNAMIC].sh_info = 0; 5486a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_DYNAMIC].sh_addralign = dynamic_alignment; 54950cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_DYNAMIC].sh_entsize = sizeof(Elf32_Dyn); 5506a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_name = shstrtab_shstrtab_offset; 55250cfe74daaece80853cb3b45d4338329b7d0345bNicolas Geoffray section_headers[SH_SHSTRTAB].sh_type = SHT_STRTAB; 5536a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_flags = 0; 5546a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_addr = shstrtab_offset; 5556a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_offset = shstrtab_offset; 5566a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_size = shstrtab_size; 5576a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_link = 0; 5586a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_info = 0; 5596a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_addralign = shstrtab_alignment; 5606a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom section_headers[SH_SHSTRTAB].sh_entsize = 0; 5616a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5626a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // phase 3: writing file 5636a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5646a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // Elf32_Ehdr 5656a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (!elf_file_->WriteFully(&elf_header, sizeof(elf_header))) { 5666a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write ELF header for " << elf_file_->GetPath(); 5676a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 5686a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 5696a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5706a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // PHDR 5716a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(phdr_offset) != lseek(elf_file_->Fd(), 0, SEEK_CUR)) { 5726a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to be at expected ELF program header offset phdr_offset " 5736a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 5746a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 5756a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 5766a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (!elf_file_->WriteFully(program_headers, sizeof(program_headers))) { 5776a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write ELF program headers for " << elf_file_->GetPath(); 5786a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 5796a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 5806a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5816a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynsym 5826a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom DCHECK_LE(phdr_offset + phdr_size, dynsym_offset); 5836a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(dynsym_offset) != lseek(elf_file_->Fd(), dynsym_offset, SEEK_SET)) { 5846a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to seek to .dynsym offset location " << dynsym_offset 5856a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 5866a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 5876a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 5886a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (!elf_file_->WriteFully(dynsym, sizeof(dynsym))) { 5896a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write .dynsym for " << elf_file_->GetPath(); 5906a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 5916a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 5926a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 5936a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynstr 5946a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom DCHECK_LE(dynsym_offset + dynsym_size, dynstr_offset); 5956a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(dynstr_offset) != lseek(elf_file_->Fd(), dynstr_offset, SEEK_SET)) { 5966a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to seek to .dynstr offset " << dynstr_offset 5976a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 5986a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 5996a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 600e2be9da597c69b92ffb707f2101b96076578b5e6Mathieu Chartier if (!elf_file_->WriteFully(&dynstr[0], dynstr_size)) { 6016a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write .dynsym for " << elf_file_->GetPath(); 6026a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6036a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6046a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 6056a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .hash 6066a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom DCHECK_LE(dynstr_offset + dynstr_size, hash_offset); 6076a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(hash_offset) != lseek(elf_file_->Fd(), hash_offset, SEEK_SET)) { 6086a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to seek to .hash offset " << hash_offset 6096a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 6106a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6116a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6126a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (!elf_file_->WriteFully(hash, sizeof(hash))) { 6136a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write .dynsym for " << elf_file_->GetPath(); 6146a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6156a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6166a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 6176a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .rodata .text 6186a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom DCHECK_LE(hash_offset + hash_size, oat_data_offset); 6196a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(oat_data_offset) != lseek(elf_file_->Fd(), oat_data_offset, SEEK_SET)) { 6206a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to seek to .rodata offset " << oat_data_offset 6216a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 6226a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6236a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 624c6dfdacea2fd9e268f70328805b0366cdd6b7b9eBrian Carlstrom BufferedOutputStream output_stream(new FileOutputStream(elf_file_)); 625c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom if (!oat_writer.Write(output_stream)) { 6266a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write .rodata and .text for " << elf_file_->GetPath(); 6276a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6286a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6296a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 6306a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .dynamic 631c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899Brian Carlstrom DCHECK_LE(oat_data_offset + oat_writer.GetSize(), dynamic_offset); 6326a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(dynamic_offset) != lseek(elf_file_->Fd(), dynamic_offset, SEEK_SET)) { 6336a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to seek to .dynamic offset " << dynamic_offset 6346a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 6356a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6366a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6376a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (!elf_file_->WriteFully(&dynamic_headers[0], dynamic_size)) { 6386a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write .dynamic for " << elf_file_->GetPath(); 6396a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6406a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6416a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 6426a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // .shstrtab 6436a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom DCHECK_LE(dynamic_offset + dynamic_size, shstrtab_offset); 6446a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(shstrtab_offset) != lseek(elf_file_->Fd(), shstrtab_offset, SEEK_SET)) { 6456a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to seek to .shstrtab offset " << shstrtab_offset 6466a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 6476a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6486a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6496a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (!elf_file_->WriteFully(&shstrtab[0], shstrtab_size)) { 6506a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write .shstrtab for " << elf_file_->GetPath(); 6516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6526a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6536a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 6546a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // section headers (after all sections) 6556a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom DCHECK_LE(shstrtab_offset + shstrtab_size, shdr_offset); 6566a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (static_cast<off_t>(shdr_offset) != lseek(elf_file_->Fd(), shdr_offset, SEEK_SET)) { 6576a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to seek to ELF section headers offset " << shdr_offset 6586a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom << " for " << elf_file_->GetPath(); 6596a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6606a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6616a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom if (!elf_file_->WriteFully(section_headers, sizeof(section_headers))) { 6626a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom PLOG(ERROR) << "Failed to write ELF section headers for " << elf_file_->GetPath(); 6636a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return false; 6646a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom } 6656a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 6668718359763aa3dcd0033a2d2e67e0cb145fb9c53Anwar Ghuloum VLOG(compiler) << "ELF file written successfully: " << elf_file_->GetPath(); 6676a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom return true; 6686a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom} 6696a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 6706a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom} // namespace art 671