1700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom/* 2700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * Copyright (C) 2012 The Android Open Source Project 3700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * 4700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * you may not use this file except in compliance with the License. 6700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * You may obtain a copy of the License at 7700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * 8700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * 10700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 11700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * See the License for the specific language governing permissions and 14700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom * limitations under the License. 15700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom */ 16700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_ELF_WRITER_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_ELF_WRITER_H_ 19700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 20265091e581c9f643b37e7966890911f09e223269Brian Carlstrom#include <stdint.h> 21265091e581c9f643b37e7966890911f09e223269Brian Carlstrom#include <cstddef> 226a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include <string> 231212a022fa5f8ef9585d765b1809521812af882cIan Rogers#include <vector> 241212a022fa5f8ef9585d765b1809521812af882cIan Rogers 256a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom#include "base/macros.h" 26719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers#include "base/mutex.h" 27265091e581c9f643b37e7966890911f09e223269Brian Carlstrom#include "os.h" 2810c13565474de2786aad7c2e79757ea250747a15Vladimir Marko#include "utils/array_ref.h" 29265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 30700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstromnamespace art { 31265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 32265091e581c9f643b37e7966890911f09e223269Brian Carlstromclass ElfFile; 3310c13565474de2786aad7c2e79757ea250747a15Vladimir Markoclass OutputStream; 3410c13565474de2786aad7c2e79757ea250747a15Vladimir Marko 35c5bfa97c47d656b76f297af8abcd5f7502987399David Srbeckynamespace debug { 3610c13565474de2786aad7c2e79757ea250747a15Vladimir Markostruct MethodDebugInfo; 37c5bfa97c47d656b76f297af8abcd5f7502987399David Srbecky} // namespace debug 38700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 39700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstromclass ElfWriter { 40700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom public: 41700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Looks up information about location of oat file in elf file container. 42700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Used for ImageWriter to perform memory layout. 43700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom static void GetOatElfInformation(File* file, 443fc9903407c6e89ffbbc92ded9e272d9de58e9b6Vladimir Marko size_t* oat_loaded_size, 453fc9903407c6e89ffbbc92ded9e272d9de58e9b6Vladimir Marko size_t* oat_data_offset); 46700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 476a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom // Returns runtime oat_data runtime address for an opened ElfFile. 4862d1ca3182a6cbb921799825f43ad36821233fd7Tong Shen static uintptr_t GetOatDataAddress(ElfFile* elf_file); 4962d1ca3182a6cbb921799825f43ad36821233fd7Tong Shen 5062d1ca3182a6cbb921799825f43ad36821233fd7Tong Shen static bool Fixup(File* file, uintptr_t oat_data_begin); 516a47b9dc850b903aabefcfab4adb132cb68bba2eBrian Carlstrom 523d504075f7c1204d581923460754bf6d3714b13fIan Rogers virtual ~ElfWriter() {} 533d504075f7c1204d581923460754bf6d3714b13fIan Rogers 5410c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual void Start() = 0; 55944da603cde59a4277f3bbc31d860a90842a1a2aVladimir Marko virtual void SetLoadedSectionSizes(size_t rodata_size, size_t text_size, size_t bss_size) = 0; 56944da603cde59a4277f3bbc31d860a90842a1a2aVladimir Marko virtual void PrepareDebugInfo(const ArrayRef<const debug::MethodDebugInfo>& method_infos) = 0; 5710c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual OutputStream* StartRoData() = 0; 5810c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual void EndRoData(OutputStream* rodata) = 0; 5910c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual OutputStream* StartText() = 0; 6010c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual void EndText(OutputStream* text) = 0; 6110c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual void WriteDynamicSection() = 0; 62c5bfa97c47d656b76f297af8abcd5f7502987399David Srbecky virtual void WriteDebugInfo(const ArrayRef<const debug::MethodDebugInfo>& method_infos) = 0; 6310c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual void WritePatchLocations(const ArrayRef<const uintptr_t>& patch_locations) = 0; 6410c13565474de2786aad7c2e79757ea250747a15Vladimir Marko virtual bool End() = 0; 65265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 66131980fc9aeb2b4d03480443e0fb494c76ce03a2Vladimir Marko // Get the ELF writer's stream. This stream can be used for writing data directly 67131980fc9aeb2b4d03480443e0fb494c76ce03a2Vladimir Marko // to a section after the section has been finished. When that's done, the user 68131980fc9aeb2b4d03480443e0fb494c76ce03a2Vladimir Marko // should Seek() back to the position where the stream was before this operation. 69131980fc9aeb2b4d03480443e0fb494c76ce03a2Vladimir Marko virtual OutputStream* GetStream() = 0; 70131980fc9aeb2b4d03480443e0fb494c76ce03a2Vladimir Marko 71944da603cde59a4277f3bbc31d860a90842a1a2aVladimir Marko // Get the size that the loaded ELF file will occupy in memory. 72944da603cde59a4277f3bbc31d860a90842a1a2aVladimir Marko virtual size_t GetLoadedSize() = 0; 73944da603cde59a4277f3bbc31d860a90842a1a2aVladimir Marko 7410c13565474de2786aad7c2e79757ea250747a15Vladimir Marko protected: 7510c13565474de2786aad7c2e79757ea250747a15Vladimir Marko ElfWriter() = default; 76700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom}; 77700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 78700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom} // namespace art 79700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 80fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_COMPILER_ELF_WRITER_H_ 81