/*
* Copyright ( C ) 2015 The Android Open Source Project
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in
* the documentation and / or other materials provided with the
* distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING ,
* BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS
* OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY ,
* OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE .
*/
#include "linker_mapped_file_fragment.h"
#include "linker_debug.h"
#include "linker_utils.h"
#include "platform/bionic/page.h"
#include <inttypes.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
MappedFileFragment::MappedFileFragment() : map_start_(nullptr), map_size_(0 ),
data_(nullptr), size_ (0 )
{ }
MappedFileFragment::~MappedFileFragment() {
if (map_start_ != nullptr) {
munmap(map_start_, map_size_);
}
}
bool MappedFileFragment::Map(int fd, off64_t base_offset, size_t elf_offset, size_t size) {
off64_t offset;
CHECK(safe_add(&offset, base_offset, elf_offset));
off64_t page_min = page_start(offset);
off64_t end_offset;
CHECK(safe_add(&end_offset, offset, size));
CHECK(safe_add(&end_offset, end_offset, page_offset(offset)));
size_t map_size = static_cast <size_t>(end_offset - page_min);
CHECK(map_size >= size);
uint8_t* map_start = static_cast <uint8_t*>(
mmap64(nullptr, map_size, PROT_READ, MAP_PRIVATE, fd, page_min));
if (map_start == MAP_FAILED) {
return false ;
}
map_start_ = map_start;
map_size_ = map_size;
data_ = map_start + page_offset(offset);
size_ = size;
return true ;
}
Messung V0.5 in Prozent C=96 H=90 G=93
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-28)
¤
*© Formatika GbR, Deutschland