Address casting on MSVC++

This commit is contained in:
Serge Lamikhov-Center 2022-02-11 09:20:38 +02:00
parent 590de384b8
commit 090444309f
6 changed files with 25 additions and 24 deletions

View File

@ -76,12 +76,12 @@ template <class S> class dynamic_section_accessor_template
generic_get_entry_dyn<Elf64_Dyn>( index, tag, value );
}
// If the tag may have a string table reference, prepare the string
// If the tag has a string table reference - prepare the string
if ( tag == DT_NEEDED || tag == DT_SONAME || tag == DT_RPATH ||
tag == DT_RUNPATH ) {
string_section_accessor strsec(
elf_file.sections[get_string_table_index()] );
const char* result = strsec.get_string( value );
const char* result = strsec.get_string( (Elf_Word)value );
if ( nullptr == result ) {
str.clear();
return false;

View File

@ -376,7 +376,7 @@ template <class S> class relocation_section_accessor_template
else {
pEntry->r_info = ELF64_R_INFO( (Elf_Xword)symbol, type );
}
pEntry->r_offset = offset;
pEntry->r_offset = decltype( pEntry->r_offset )( offset );
pEntry->r_offset = convertor( pEntry->r_offset );
pEntry->r_info = convertor( pEntry->r_info );
}
@ -401,8 +401,8 @@ template <class S> class relocation_section_accessor_template
else {
pEntry->r_info = ELF64_R_INFO( (Elf_Xword)symbol, type );
}
pEntry->r_offset = offset;
pEntry->r_addend = addend;
pEntry->r_offset = decltype( pEntry->r_offset )( offset );
pEntry->r_addend = decltype( pEntry->r_addend )( addend );
pEntry->r_offset = convertor( pEntry->r_offset );
pEntry->r_info = convertor( pEntry->r_info );
pEntry->r_addend = convertor( pEntry->r_addend );
@ -415,8 +415,8 @@ template <class S> class relocation_section_accessor_template
const endianess_convertor& convertor = elf_file.get_convertor();
T entry;
entry.r_offset = offset;
entry.r_info = info;
entry.r_offset = decltype( entry.r_offset )( offset );
entry.r_info = decltype( entry.r_info )( info );
entry.r_offset = convertor( entry.r_offset );
entry.r_info = convertor( entry.r_info );

View File

@ -113,7 +113,7 @@ template <class T> class section_impl : public section
//------------------------------------------------------------------------------
void set_address( Elf64_Addr value ) override
{
header.sh_addr = value;
header.sh_addr = decltype( header.sh_addr )( value );
header.sh_addr = ( *convertor )( header.sh_addr );
is_address_set = true;
}
@ -208,7 +208,7 @@ template <class T> class section_impl : public section
if ( translator->empty() ) {
stream.seekg( 0, stream.end );
set_stream_size( stream.tellg() );
set_stream_size( size_t( stream.tellg() ) );
}
else {
set_stream_size( std::numeric_limits<size_t>::max() );
@ -220,14 +220,14 @@ template <class T> class section_impl : public section
Elf_Xword size = get_size();
if ( nullptr == data && SHT_NULL != get_type() &&
SHT_NOBITS != get_type() && size < get_stream_size() ) {
data = new ( std::nothrow ) char[size + 1];
data = new ( std::nothrow ) char[size_t( size ) + 1];
if ( ( 0 != size ) && ( nullptr != data ) ) {
stream.seekg(
( *translator )[( *convertor )( header.sh_offset )] );
stream.read( data, size );
data[size] = 0; // Ensure data is ended with 0 to avoid oob read
data_size = size;
data_size = decltype( data_size )( size );
}
else {
data_size = 0;
@ -241,7 +241,7 @@ template <class T> class section_impl : public section
std::streampos data_offset ) override
{
if ( 0 != get_index() ) {
header.sh_offset = data_offset;
header.sh_offset = decltype( header.sh_offset )( data_offset );
header.sh_offset = ( *convertor )( header.sh_offset );
}

View File

@ -141,7 +141,7 @@ template <class T> class segment_impl : public segment
//------------------------------------------------------------------------------
void set_offset( Elf64_Off value ) override
{
ph.p_offset = value;
ph.p_offset = decltype( ph.p_offset )( value );
ph.p_offset = ( *convertor )( ph.p_offset );
is_offset_set = true;
}
@ -163,7 +163,7 @@ template <class T> class segment_impl : public segment
{
if ( translator->empty() ) {
stream.seekg( 0, stream.end );
set_stream_size( stream.tellg() );
set_stream_size( size_t( stream.tellg() ) );
}
else {
set_stream_size( std::numeric_limits<size_t>::max() );
@ -181,7 +181,7 @@ template <class T> class segment_impl : public segment
data = nullptr;
}
else {
data = new ( std::nothrow ) char[size + 1];
data = new ( std::nothrow ) char[(size_t)size + 1];
if ( nullptr != data ) {
stream.read( data, size );
@ -196,7 +196,7 @@ template <class T> class segment_impl : public segment
std::streampos header_offset,
std::streampos data_offset ) override
{
ph.p_offset = data_offset;
ph.p_offset = decltype( ph.p_offset )( data_offset );
ph.p_offset = ( *convertor )( ph.p_offset );
adjust_stream_size( stream, header_offset );
stream.write( reinterpret_cast<const char*>( &ph ), sizeof( ph ) );

View File

@ -234,7 +234,7 @@ template <class S> class symbol_section_accessor_template
std::function<void( Elf_Xword first, Elf_Xword second )> func =
nullptr )
{
int nRet = 0;
Elf_Xword nRet = 0;
if ( elf_file.get_class() == ELFCLASS32 ) {
nRet = generic_arrange_local_symbols<Elf32_Sym>( func );
@ -466,9 +466,9 @@ template <class S> class symbol_section_accessor_template
T entry;
entry.st_name = convertor( name );
entry.st_value = value;
entry.st_value = decltype( entry.st_value )( value );
entry.st_value = convertor( entry.st_value );
entry.st_size = size;
entry.st_size = decltype( entry.st_size )( size );
entry.st_size = convertor( entry.st_size );
entry.st_info = convertor( info );
entry.st_other = convertor( other );
@ -477,7 +477,8 @@ template <class S> class symbol_section_accessor_template
symbol_section->append_data( reinterpret_cast<char*>( &entry ),
sizeof( entry ) );
Elf_Word nRet = symbol_section->get_size() / sizeof( entry ) - 1;
Elf_Word nRet =
Elf_Word( symbol_section->get_size() / sizeof( entry ) - 1 );
return nRet;
}
@ -489,7 +490,7 @@ template <class S> class symbol_section_accessor_template
{
const endianess_convertor& convertor = elf_file.get_convertor();
Elf_Xword first_not_local =
Elf_Word first_not_local =
1; // Skip the first entry. It is always NOTYPE
Elf_Xword current = 0;
Elf_Xword count = get_symbols_num();

View File

@ -41,14 +41,14 @@ THE SOFTWARE.
#define ELFIO_SET_ACCESS( TYPE, NAME, FIELD ) \
void set_##NAME( TYPE value ) override \
{ \
FIELD = value; \
FIELD = decltype( FIELD )( value ); \
FIELD = ( *convertor )( FIELD ); \
}
#define ELFIO_GET_SET_ACCESS( TYPE, NAME, FIELD ) \
TYPE get_##NAME() const override { return ( *convertor )( FIELD ); } \
void set_##NAME( TYPE value ) override \
{ \
FIELD = value; \
FIELD = decltype( FIELD )( value ); \
FIELD = ( *convertor )( FIELD ); \
}
@ -256,7 +256,7 @@ inline void adjust_stream_size( std::ostream& stream, std::streamsize offset )
stream.seekp( 0, std::ios_base::end );
if ( stream.tellp() < offset ) {
std::streamsize size = offset - stream.tellp();
stream.write( std::string( size, '\0' ).c_str(), size );
stream.write( std::string( size_t( size ), '\0' ).c_str(), size );
}
stream.seekp( offset );
}