Merge "Always use signed leb128 decoder"

This commit is contained in:
Dmitriy Ivanov 2015-04-22 22:15:47 +00:00 committed by Gerrit Code Review
commit ff18108981
3 changed files with 11 additions and 52 deletions

View File

@ -55,7 +55,7 @@
#include "linker_block_allocator.h" #include "linker_block_allocator.h"
#include "linker_debug.h" #include "linker_debug.h"
#include "linker_environ.h" #include "linker_environ.h"
#include "linker_leb128.h" #include "linker_sleb128.h"
#include "linker_phdr.h" #include "linker_phdr.h"
#include "linker_relocs.h" #include "linker_relocs.h"
#include "linker_reloc_iterators.h" #include "linker_reloc_iterators.h"
@ -2875,7 +2875,7 @@ bool soinfo::link_image(const soinfo_list_t& global_group, const soinfo_list_t&
if (android_relocs_size_ > 3 && if (android_relocs_size_ > 3 &&
android_relocs_[0] == 'A' && android_relocs_[0] == 'A' &&
android_relocs_[1] == 'P' && android_relocs_[1] == 'P' &&
(android_relocs_[2] == 'U' || android_relocs_[2] == 'S') && android_relocs_[2] == 'S' &&
android_relocs_[3] == '2') { android_relocs_[3] == '2') {
DEBUG("[ android relocating %s ]", get_soname()); DEBUG("[ android relocating %s ]", get_soname());
@ -2883,17 +2883,10 @@ bool soinfo::link_image(const soinfo_list_t& global_group, const soinfo_list_t&
const uint8_t* packed_relocs = android_relocs_ + 4; const uint8_t* packed_relocs = android_relocs_ + 4;
const size_t packed_relocs_size = android_relocs_size_ - 4; const size_t packed_relocs_size = android_relocs_size_ - 4;
if (android_relocs_[2] == 'U') { relocated = relocate(
relocated = relocate( packed_reloc_iterator<sleb128_decoder>(
packed_reloc_iterator<leb128_decoder>( sleb128_decoder(packed_relocs, packed_relocs_size)),
leb128_decoder(packed_relocs, packed_relocs_size)), global_group, local_group);
global_group, local_group);
} else { // android_relocs_[2] == 'S'
relocated = relocate(
packed_reloc_iterator<sleb128_decoder>(
sleb128_decoder(packed_relocs, packed_relocs_size)),
global_group, local_group);
}
if (!relocated) { if (!relocated) {
return false; return false;

View File

@ -30,7 +30,7 @@
#include "linker_debug.h" #include "linker_debug.h"
#include "linker_relocs.h" #include "linker_relocs.h"
#include "linker_reloc_iterators.h" #include "linker_reloc_iterators.h"
#include "linker_leb128.h" #include "linker_sleb128.h"
template bool soinfo::relocate<plain_reloc_iterator>(plain_reloc_iterator&& rel_iterator, template bool soinfo::relocate<plain_reloc_iterator>(plain_reloc_iterator&& rel_iterator,
const soinfo_list_t& global_group, const soinfo_list_t& global_group,
@ -41,11 +41,6 @@ template bool soinfo::relocate<packed_reloc_iterator<sleb128_decoder>>(
const soinfo_list_t& global_group, const soinfo_list_t& global_group,
const soinfo_list_t& local_group); const soinfo_list_t& local_group);
template bool soinfo::relocate<packed_reloc_iterator<leb128_decoder>>(
packed_reloc_iterator<leb128_decoder>&& rel_iterator,
const soinfo_list_t& global_group,
const soinfo_list_t& local_group);
template <typename ElfRelIteratorT> template <typename ElfRelIteratorT>
bool soinfo::relocate(ElfRelIteratorT&& rel_iterator, bool soinfo::relocate(ElfRelIteratorT&& rel_iterator,
const soinfo_list_t& global_group, const soinfo_list_t& global_group,

View File

@ -14,42 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef _LINKER_LEB128_H #ifndef _LINKER_SLEB128_H
#define _LINKER_LEB128_H #define _LINKER_SLEB128_H
#include <stdint.h> #include <stdint.h>
// Helper classes for decoding LEB128, used in packed relocation data. // Helper classes for decoding LEB128, used in packed relocation data.
// http://en.wikipedia.org/wiki/LEB128 // http://en.wikipedia.org/wiki/LEB128
class leb128_decoder {
public:
leb128_decoder(const uint8_t* buffer, size_t count)
: current_(buffer), end_(buffer + count) { }
size_t pop_front() {
size_t value = 0;
size_t shift = 0;
uint8_t byte;
do {
if (current_ >= end_) {
__libc_fatal("leb128_decoder ran out of bounds");
}
byte = *current_++;
value |= static_cast<size_t>(byte & 127) << shift;
shift += 7;
} while (byte & 128);
return value;
}
private:
const uint8_t* current_;
const uint8_t* const end_;
};
class sleb128_decoder { class sleb128_decoder {
public: public:
sleb128_decoder(const uint8_t* buffer, size_t count) sleb128_decoder(const uint8_t* buffer, size_t count)
@ -64,7 +36,7 @@ class sleb128_decoder {
do { do {
if (current_ >= end_) { if (current_ >= end_) {
__libc_fatal("leb128_decoder ran out of bounds"); __libc_fatal("sleb128_decoder ran out of bounds");
} }
byte = *current_++; byte = *current_++;
value |= (static_cast<size_t>(byte & 127) << shift); value |= (static_cast<size_t>(byte & 127) << shift);
@ -83,5 +55,4 @@ class sleb128_decoder {
const uint8_t* const end_; const uint8_t* const end_;
}; };
#endif // __LINKER_LEB128_H #endif // __LINKER_SLEB128_H