Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <elf.h>
     18 
     19 #include <memory>
     20 
     21 #include <gtest/gtest.h>
     22 
     23 #include "ElfInterface.h"
     24 #include "ElfInterfaceArm.h"
     25 
     26 #include "MemoryFake.h"
     27 
     28 #if !defined(PT_ARM_EXIDX)
     29 #define PT_ARM_EXIDX 0x70000001
     30 #endif
     31 
     32 #if !defined(EM_AARCH64)
     33 #define EM_AARCH64 183
     34 #endif
     35 
     36 class ElfInterfaceTest : public ::testing::Test {
     37  protected:
     38   void SetUp() override {
     39     memory_.Clear();
     40   }
     41 
     42   void SetStringMemory(uint64_t offset, const char* string) {
     43     memory_.SetMemory(offset, string, strlen(string) + 1);
     44   }
     45 
     46   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     47   void SinglePtLoad();
     48 
     49   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     50   void MultipleExecutablePtLoads();
     51 
     52   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     53   void MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr();
     54 
     55   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     56   void NonExecutablePtLoads();
     57 
     58   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     59   void ManyPhdrs();
     60 
     61   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     62   void Soname();
     63 
     64   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     65   void SonameAfterDtNull();
     66 
     67   template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     68   void SonameSize();
     69 
     70   MemoryFake memory_;
     71 };
     72 
     73 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
     74 void ElfInterfaceTest::SinglePtLoad() {
     75   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
     76 
     77   Ehdr ehdr;
     78   memset(&ehdr, 0, sizeof(ehdr));
     79   ehdr.e_phoff = 0x100;
     80   ehdr.e_phnum = 1;
     81   ehdr.e_phentsize = sizeof(Phdr);
     82   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
     83 
     84   Phdr phdr;
     85   memset(&phdr, 0, sizeof(phdr));
     86   phdr.p_type = PT_LOAD;
     87   phdr.p_vaddr = 0x2000;
     88   phdr.p_memsz = 0x10000;
     89   phdr.p_flags = PF_R | PF_X;
     90   phdr.p_align = 0x1000;
     91   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
     92 
     93   ASSERT_TRUE(elf->Init());
     94 
     95   const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads();
     96   ASSERT_EQ(1U, pt_loads.size());
     97   LoadInfo load_data = pt_loads.at(0);
     98   ASSERT_EQ(0U, load_data.offset);
     99   ASSERT_EQ(0x2000U, load_data.table_offset);
    100   ASSERT_EQ(0x10000U, load_data.table_size);
    101 }
    102 
    103 TEST_F(ElfInterfaceTest, elf32_single_pt_load) {
    104   SinglePtLoad<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>();
    105 }
    106 
    107 TEST_F(ElfInterfaceTest, elf64_single_pt_load) {
    108   SinglePtLoad<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>();
    109 }
    110 
    111 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
    112 void ElfInterfaceTest::MultipleExecutablePtLoads() {
    113   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
    114 
    115   Ehdr ehdr;
    116   memset(&ehdr, 0, sizeof(ehdr));
    117   ehdr.e_phoff = 0x100;
    118   ehdr.e_phnum = 3;
    119   ehdr.e_phentsize = sizeof(Phdr);
    120   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    121 
    122   Phdr phdr;
    123   memset(&phdr, 0, sizeof(phdr));
    124   phdr.p_type = PT_LOAD;
    125   phdr.p_vaddr = 0x2000;
    126   phdr.p_memsz = 0x10000;
    127   phdr.p_flags = PF_R | PF_X;
    128   phdr.p_align = 0x1000;
    129   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
    130 
    131   memset(&phdr, 0, sizeof(phdr));
    132   phdr.p_type = PT_LOAD;
    133   phdr.p_offset = 0x1000;
    134   phdr.p_vaddr = 0x2001;
    135   phdr.p_memsz = 0x10001;
    136   phdr.p_flags = PF_R | PF_X;
    137   phdr.p_align = 0x1001;
    138   memory_.SetMemory(0x100 + sizeof(phdr), &phdr, sizeof(phdr));
    139 
    140   memset(&phdr, 0, sizeof(phdr));
    141   phdr.p_type = PT_LOAD;
    142   phdr.p_offset = 0x2000;
    143   phdr.p_vaddr = 0x2002;
    144   phdr.p_memsz = 0x10002;
    145   phdr.p_flags = PF_R | PF_X;
    146   phdr.p_align = 0x1002;
    147   memory_.SetMemory(0x100 + 2 * sizeof(phdr), &phdr, sizeof(phdr));
    148 
    149   ASSERT_TRUE(elf->Init());
    150 
    151   const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads();
    152   ASSERT_EQ(3U, pt_loads.size());
    153 
    154   LoadInfo load_data = pt_loads.at(0);
    155   ASSERT_EQ(0U, load_data.offset);
    156   ASSERT_EQ(0x2000U, load_data.table_offset);
    157   ASSERT_EQ(0x10000U, load_data.table_size);
    158 
    159   load_data = pt_loads.at(0x1000);
    160   ASSERT_EQ(0x1000U, load_data.offset);
    161   ASSERT_EQ(0x2001U, load_data.table_offset);
    162   ASSERT_EQ(0x10001U, load_data.table_size);
    163 
    164   load_data = pt_loads.at(0x2000);
    165   ASSERT_EQ(0x2000U, load_data.offset);
    166   ASSERT_EQ(0x2002U, load_data.table_offset);
    167   ASSERT_EQ(0x10002U, load_data.table_size);
    168 }
    169 
    170 TEST_F(ElfInterfaceTest, elf32_multiple_executable_pt_loads) {
    171   MultipleExecutablePtLoads<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>();
    172 }
    173 
    174 TEST_F(ElfInterfaceTest, elf64_multiple_executable_pt_loads) {
    175   MultipleExecutablePtLoads<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>();
    176 }
    177 
    178 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
    179 void ElfInterfaceTest::MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr() {
    180   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
    181 
    182   Ehdr ehdr;
    183   memset(&ehdr, 0, sizeof(ehdr));
    184   ehdr.e_phoff = 0x100;
    185   ehdr.e_phnum = 3;
    186   ehdr.e_phentsize = sizeof(Phdr) + 100;
    187   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    188 
    189   Phdr phdr;
    190   memset(&phdr, 0, sizeof(phdr));
    191   phdr.p_type = PT_LOAD;
    192   phdr.p_vaddr = 0x2000;
    193   phdr.p_memsz = 0x10000;
    194   phdr.p_flags = PF_R | PF_X;
    195   phdr.p_align = 0x1000;
    196   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
    197 
    198   memset(&phdr, 0, sizeof(phdr));
    199   phdr.p_type = PT_LOAD;
    200   phdr.p_offset = 0x1000;
    201   phdr.p_vaddr = 0x2001;
    202   phdr.p_memsz = 0x10001;
    203   phdr.p_flags = PF_R | PF_X;
    204   phdr.p_align = 0x1001;
    205   memory_.SetMemory(0x100 + sizeof(phdr) + 100, &phdr, sizeof(phdr));
    206 
    207   memset(&phdr, 0, sizeof(phdr));
    208   phdr.p_type = PT_LOAD;
    209   phdr.p_offset = 0x2000;
    210   phdr.p_vaddr = 0x2002;
    211   phdr.p_memsz = 0x10002;
    212   phdr.p_flags = PF_R | PF_X;
    213   phdr.p_align = 0x1002;
    214   memory_.SetMemory(0x100 + 2 * (sizeof(phdr) + 100), &phdr, sizeof(phdr));
    215 
    216   ASSERT_TRUE(elf->Init());
    217 
    218   const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads();
    219   ASSERT_EQ(3U, pt_loads.size());
    220 
    221   LoadInfo load_data = pt_loads.at(0);
    222   ASSERT_EQ(0U, load_data.offset);
    223   ASSERT_EQ(0x2000U, load_data.table_offset);
    224   ASSERT_EQ(0x10000U, load_data.table_size);
    225 
    226   load_data = pt_loads.at(0x1000);
    227   ASSERT_EQ(0x1000U, load_data.offset);
    228   ASSERT_EQ(0x2001U, load_data.table_offset);
    229   ASSERT_EQ(0x10001U, load_data.table_size);
    230 
    231   load_data = pt_loads.at(0x2000);
    232   ASSERT_EQ(0x2000U, load_data.offset);
    233   ASSERT_EQ(0x2002U, load_data.table_offset);
    234   ASSERT_EQ(0x10002U, load_data.table_size);
    235 }
    236 
    237 TEST_F(ElfInterfaceTest, elf32_multiple_executable_pt_loads_increments_not_size_of_phdr) {
    238   MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn,
    239                                                    ElfInterface32>();
    240 }
    241 
    242 TEST_F(ElfInterfaceTest, elf64_multiple_executable_pt_loads_increments_not_size_of_phdr) {
    243   MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn,
    244                                                    ElfInterface64>();
    245 }
    246 
    247 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
    248 void ElfInterfaceTest::NonExecutablePtLoads() {
    249   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
    250 
    251   Ehdr ehdr;
    252   memset(&ehdr, 0, sizeof(ehdr));
    253   ehdr.e_phoff = 0x100;
    254   ehdr.e_phnum = 3;
    255   ehdr.e_phentsize = sizeof(Phdr);
    256   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    257 
    258   Phdr phdr;
    259   memset(&phdr, 0, sizeof(phdr));
    260   phdr.p_type = PT_LOAD;
    261   phdr.p_vaddr = 0x2000;
    262   phdr.p_memsz = 0x10000;
    263   phdr.p_flags = PF_R;
    264   phdr.p_align = 0x1000;
    265   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
    266 
    267   memset(&phdr, 0, sizeof(phdr));
    268   phdr.p_type = PT_LOAD;
    269   phdr.p_offset = 0x1000;
    270   phdr.p_vaddr = 0x2001;
    271   phdr.p_memsz = 0x10001;
    272   phdr.p_flags = PF_R | PF_X;
    273   phdr.p_align = 0x1001;
    274   memory_.SetMemory(0x100 + sizeof(phdr), &phdr, sizeof(phdr));
    275 
    276   memset(&phdr, 0, sizeof(phdr));
    277   phdr.p_type = PT_LOAD;
    278   phdr.p_offset = 0x2000;
    279   phdr.p_vaddr = 0x2002;
    280   phdr.p_memsz = 0x10002;
    281   phdr.p_flags = PF_R;
    282   phdr.p_align = 0x1002;
    283   memory_.SetMemory(0x100 + 2 * sizeof(phdr), &phdr, sizeof(phdr));
    284 
    285   ASSERT_TRUE(elf->Init());
    286 
    287   const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads();
    288   ASSERT_EQ(1U, pt_loads.size());
    289 
    290   LoadInfo load_data = pt_loads.at(0x1000);
    291   ASSERT_EQ(0x1000U, load_data.offset);
    292   ASSERT_EQ(0x2001U, load_data.table_offset);
    293   ASSERT_EQ(0x10001U, load_data.table_size);
    294 }
    295 
    296 TEST_F(ElfInterfaceTest, elf32_non_executable_pt_loads) {
    297   NonExecutablePtLoads<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>();
    298 }
    299 
    300 TEST_F(ElfInterfaceTest, elf64_non_executable_pt_loads) {
    301   NonExecutablePtLoads<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>();
    302 }
    303 
    304 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
    305 void ElfInterfaceTest::ManyPhdrs() {
    306   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
    307 
    308   Ehdr ehdr;
    309   memset(&ehdr, 0, sizeof(ehdr));
    310   ehdr.e_phoff = 0x100;
    311   ehdr.e_phnum = 7;
    312   ehdr.e_phentsize = sizeof(Phdr);
    313   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    314 
    315   Phdr phdr;
    316   uint64_t phdr_offset = 0x100;
    317 
    318   memset(&phdr, 0, sizeof(phdr));
    319   phdr.p_type = PT_LOAD;
    320   phdr.p_vaddr = 0x2000;
    321   phdr.p_memsz = 0x10000;
    322   phdr.p_flags = PF_R | PF_X;
    323   phdr.p_align = 0x1000;
    324   memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr));
    325   phdr_offset += sizeof(phdr);
    326 
    327   memset(&phdr, 0, sizeof(phdr));
    328   phdr.p_type = PT_GNU_EH_FRAME;
    329   memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr));
    330   phdr_offset += sizeof(phdr);
    331 
    332   memset(&phdr, 0, sizeof(phdr));
    333   phdr.p_type = PT_DYNAMIC;
    334   memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr));
    335   phdr_offset += sizeof(phdr);
    336 
    337   memset(&phdr, 0, sizeof(phdr));
    338   phdr.p_type = PT_INTERP;
    339   memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr));
    340   phdr_offset += sizeof(phdr);
    341 
    342   memset(&phdr, 0, sizeof(phdr));
    343   phdr.p_type = PT_NOTE;
    344   memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr));
    345   phdr_offset += sizeof(phdr);
    346 
    347   memset(&phdr, 0, sizeof(phdr));
    348   phdr.p_type = PT_SHLIB;
    349   memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr));
    350   phdr_offset += sizeof(phdr);
    351 
    352   memset(&phdr, 0, sizeof(phdr));
    353   phdr.p_type = PT_GNU_EH_FRAME;
    354   memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr));
    355   phdr_offset += sizeof(phdr);
    356 
    357   ASSERT_TRUE(elf->Init());
    358 
    359   const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads();
    360   ASSERT_EQ(1U, pt_loads.size());
    361 
    362   LoadInfo load_data = pt_loads.at(0);
    363   ASSERT_EQ(0U, load_data.offset);
    364   ASSERT_EQ(0x2000U, load_data.table_offset);
    365   ASSERT_EQ(0x10000U, load_data.table_size);
    366 }
    367 
    368 TEST_F(ElfInterfaceTest, elf32_many_phdrs) {
    369   ElfInterfaceTest::ManyPhdrs<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>();
    370 }
    371 
    372 TEST_F(ElfInterfaceTest, elf64_many_phdrs) {
    373   ElfInterfaceTest::ManyPhdrs<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>();
    374 }
    375 
    376 TEST_F(ElfInterfaceTest, elf32_arm) {
    377   ElfInterfaceArm elf_arm(&memory_);
    378 
    379   Elf32_Ehdr ehdr;
    380   memset(&ehdr, 0, sizeof(ehdr));
    381   ehdr.e_phoff = 0x100;
    382   ehdr.e_phnum = 1;
    383   ehdr.e_phentsize = sizeof(Elf32_Phdr);
    384   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    385 
    386   Elf32_Phdr phdr;
    387   memset(&phdr, 0, sizeof(phdr));
    388   phdr.p_type = PT_ARM_EXIDX;
    389   phdr.p_vaddr = 0x2000;
    390   phdr.p_memsz = 16;
    391   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
    392 
    393   // Add arm exidx entries.
    394   memory_.SetData32(0x2000, 0x1000);
    395   memory_.SetData32(0x2008, 0x1000);
    396 
    397   ASSERT_TRUE(elf_arm.Init());
    398 
    399   std::vector<uint32_t> entries;
    400   for (auto addr : elf_arm) {
    401     entries.push_back(addr);
    402   }
    403   ASSERT_EQ(2U, entries.size());
    404   ASSERT_EQ(0x3000U, entries[0]);
    405   ASSERT_EQ(0x3008U, entries[1]);
    406 
    407   ASSERT_EQ(0x2000U, elf_arm.start_offset());
    408   ASSERT_EQ(2U, elf_arm.total_entries());
    409 }
    410 
    411 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
    412 void ElfInterfaceTest::Soname() {
    413   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
    414 
    415   Ehdr ehdr;
    416   memset(&ehdr, 0, sizeof(ehdr));
    417   ehdr.e_phoff = 0x100;
    418   ehdr.e_phnum = 1;
    419   ehdr.e_phentsize = sizeof(Phdr);
    420   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    421 
    422   Phdr phdr;
    423   memset(&phdr, 0, sizeof(phdr));
    424   phdr.p_type = PT_DYNAMIC;
    425   phdr.p_offset = 0x2000;
    426   phdr.p_memsz = sizeof(Dyn) * 3;
    427   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
    428 
    429   uint64_t offset = 0x2000;
    430   Dyn dyn;
    431 
    432   dyn.d_tag = DT_STRTAB;
    433   dyn.d_un.d_ptr = 0x10000;
    434   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    435   offset += sizeof(dyn);
    436 
    437   dyn.d_tag = DT_STRSZ;
    438   dyn.d_un.d_val = 0x1000;
    439   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    440   offset += sizeof(dyn);
    441 
    442   dyn.d_tag = DT_SONAME;
    443   dyn.d_un.d_val = 0x10;
    444   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    445   offset += sizeof(dyn);
    446 
    447   dyn.d_tag = DT_NULL;
    448   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    449 
    450   SetStringMemory(0x10010, "fake_soname.so");
    451 
    452   ASSERT_TRUE(elf->Init());
    453   std::string name;
    454   ASSERT_TRUE(elf->GetSoname(&name));
    455   ASSERT_STREQ("fake_soname.so", name.c_str());
    456 }
    457 
    458 TEST_F(ElfInterfaceTest, elf32_soname) {
    459   Soname<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>();
    460 }
    461 
    462 TEST_F(ElfInterfaceTest, elf64_soname) {
    463   Soname<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>();
    464 }
    465 
    466 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
    467 void ElfInterfaceTest::SonameAfterDtNull() {
    468   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
    469 
    470   Ehdr ehdr;
    471   memset(&ehdr, 0, sizeof(ehdr));
    472   ehdr.e_phoff = 0x100;
    473   ehdr.e_phnum = 1;
    474   ehdr.e_phentsize = sizeof(Phdr);
    475   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    476 
    477   Phdr phdr;
    478   memset(&phdr, 0, sizeof(phdr));
    479   phdr.p_type = PT_DYNAMIC;
    480   phdr.p_offset = 0x2000;
    481   phdr.p_memsz = sizeof(Dyn) * 3;
    482   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
    483 
    484   Dyn dyn;
    485   uint64_t offset = 0x2000;
    486 
    487   dyn.d_tag = DT_STRTAB;
    488   dyn.d_un.d_ptr = 0x10000;
    489   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    490   offset += sizeof(dyn);
    491 
    492   dyn.d_tag = DT_STRSZ;
    493   dyn.d_un.d_val = 0x1000;
    494   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    495   offset += sizeof(dyn);
    496 
    497   dyn.d_tag = DT_NULL;
    498   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    499   offset += sizeof(dyn);
    500 
    501   dyn.d_tag = DT_SONAME;
    502   dyn.d_un.d_val = 0x10;
    503   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    504   offset += sizeof(dyn);
    505 
    506   SetStringMemory(0x10010, "fake_soname.so");
    507 
    508   ASSERT_TRUE(elf->Init());
    509   std::string name;
    510   ASSERT_FALSE(elf->GetSoname(&name));
    511 }
    512 
    513 TEST_F(ElfInterfaceTest, elf32_soname_after_dt_null) {
    514   SonameAfterDtNull<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>();
    515 }
    516 
    517 TEST_F(ElfInterfaceTest, elf64_soname_after_dt_null) {
    518   SonameAfterDtNull<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>();
    519 }
    520 
    521 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType>
    522 void ElfInterfaceTest::SonameSize() {
    523   std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_));
    524 
    525   Ehdr ehdr;
    526   memset(&ehdr, 0, sizeof(ehdr));
    527   ehdr.e_phoff = 0x100;
    528   ehdr.e_phnum = 1;
    529   ehdr.e_phentsize = sizeof(Phdr);
    530   memory_.SetMemory(0, &ehdr, sizeof(ehdr));
    531 
    532   Phdr phdr;
    533   memset(&phdr, 0, sizeof(phdr));
    534   phdr.p_type = PT_DYNAMIC;
    535   phdr.p_offset = 0x2000;
    536   phdr.p_memsz = sizeof(Dyn);
    537   memory_.SetMemory(0x100, &phdr, sizeof(phdr));
    538 
    539   Dyn dyn;
    540   uint64_t offset = 0x2000;
    541 
    542   dyn.d_tag = DT_STRTAB;
    543   dyn.d_un.d_ptr = 0x10000;
    544   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    545   offset += sizeof(dyn);
    546 
    547   dyn.d_tag = DT_STRSZ;
    548   dyn.d_un.d_val = 0x10;
    549   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    550   offset += sizeof(dyn);
    551 
    552   dyn.d_tag = DT_SONAME;
    553   dyn.d_un.d_val = 0x10;
    554   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    555   offset += sizeof(dyn);
    556 
    557   dyn.d_tag = DT_NULL;
    558   memory_.SetMemory(offset, &dyn, sizeof(dyn));
    559 
    560   SetStringMemory(0x10010, "fake_soname.so");
    561 
    562   ASSERT_TRUE(elf->Init());
    563   std::string name;
    564   ASSERT_FALSE(elf->GetSoname(&name));
    565 }
    566 
    567 TEST_F(ElfInterfaceTest, elf32_soname_size) {
    568   SonameSize<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>();
    569 }
    570 
    571 TEST_F(ElfInterfaceTest, elf64_soname_size) {
    572   SonameSize<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>();
    573 }
    574