Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
android /platform /bionic /refs/heads/main /. /libc /bionic /elf_note.cpp
blob: 28a400a770127352ee3f31d163696932c07151ab [file] [log] [blame] [edit]
/*
* Copyright (C) 2024 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"platform/bionic/macros.h"
#include"private/elf_note.h"
#include<string.h>
bool __get_elf_note(unsigned note_type,constchar* note_name,constElfW(Addr) note_addr,
constElfW(Phdr)* phdr_note,constElfW(Nhdr)** note_hdr,
constchar** note_desc){
if(phdr_note->p_type!= PT_NOTE||!note_name||!note_addr){
returnfalse;
}
size_t note_name_len= strlen(note_name)+1;
ElfW(Addr) p= note_addr;
ElfW(Addr) note_end= p+ phdr_note->p_memsz;
while(p< note_end){
// Parse the note and check it's structurally valid.
constElfW(Nhdr)* note=reinterpret_cast<constElfW(Nhdr)*>(p);
if(__builtin_add_overflow(p,sizeof(ElfW(Nhdr)),&p)|| p>= note_end){
returnfalse;
}
constchar* name=reinterpret_cast<constchar*>(p);
if(__builtin_add_overflow(p, __builtin_align_up(note->n_namesz,4),&p)){
returnfalse;
}
constchar* desc=reinterpret_cast<constchar*>(p);
if(__builtin_add_overflow(p, __builtin_align_up(note->n_descsz,4),&p)){
returnfalse;
}
if(p> note_end){
returnfalse;
}
// Is this the note we're looking for?
if(note->n_type== note_type&&
note->n_namesz== note_name_len&&
strncmp(note_name, name, note_name_len)==0){
*note_hdr= note;
*note_desc= desc;
returntrue;
}
}
returnfalse;
}
bool __find_elf_note(unsignedint note_type,constchar* note_name,constElfW(Phdr)* phdr_start,
size_t phdr_ct,constElfW(Nhdr)** note_hdr,constchar** note_desc,
constElfW(Addr) load_bias){
for(size_t i=0; i< phdr_ct;++i){
constElfW(Phdr)* phdr=&phdr_start[i];
ElfW(Addr) note_addr= load_bias+ phdr->p_vaddr;
if(__get_elf_note(note_type, note_name, note_addr, phdr, note_hdr, note_desc)){
returntrue;
}
}
returnfalse;
}

[8]ページ先頭

©2009-2025 Movatter.jp