49316
私は「[Android-disassembler](https://kyhsgeekcode.github.io/Android-
Disassembler/)」という逆アセンブラを開発しています。現在このELFファイルのすべての`.text`セクションをすべて逆アセンブルするには成功しました。

ところが、今はElfファイルのdynsymセクションとsymtabセクションの情報を利用して、シンボルの名前とアドレスを取得したいだと思います。

私はStack Overflowのいくつかの記事を見て、少し役立つ情報を見つけました。

これは、C言語で書かれていたので、

```

    for (size_t header_index = 0; header_index < info->dlpi_phnum; header_index++)
                {
    
            /* Further processing is only needed if the dynamic section is reached */
                    if (info->dlpi_phdr[header_index].p_type == PT_DYNAMIC)
                {
    
            /* Get a pointer to the first entry of the dynamic section.
             * It's address is the shared lib's address + the virtual address */
            dyn = (ElfW(Dyn)*)(info->dlpi_addr +  info->dlpi_phdr[header_index].p_vaddr);
    
            /* Iterate over all entries of the dynamic section until the
             * end of the symbol table is reached. This is indicated by
             * an entry with d_tag == DT_NULL.
             *
             * Only the following entries need to be processed to find the
             * symbol names:
             *  - DT_HASH   -> second word of the hash is the number of symbols
             *  - DT_STRTAB -> pointer to the beginning of a string table that
             *                 contains the symbol names
             *  - DT_SYMTAB -> pointer to the beginning of the symbols table
             */
                while(dyn->d_tag != DT_NULL)
                    {
                if (dyn->d_tag == DT_HASH)
                {
                        /* Get a pointer to the hash */
                        hash = (ElfW(Word*))dyn->d_un.d_ptr;
    
            /* The 2nd word is the number of symbols */
                        sym_cnt = hash[1];
    
                    }
                else if (dyn->d_tag == DT_STRTAB)
                {
                        /* Get the pointer to the string table */
                    strtab = (char*)dyn->d_un.d_ptr;
            }
                else if (dyn->d_tag == DT_SYMTAB)
                {
            /* Get the pointer to the first entry of the symbol table */
            sym = (ElfW(Sym*))dyn->d_un.d_ptr;
    
    
            /* Iterate over the symbol table */
            for (ElfW(Word) sym_index = 0; sym_index < sym_cnt; sym_index++)
                {
            /* get the name of the i-th symbol.
             * This is located at the address of st_name
             * relative to the beginning of the string table. */
                sym_name = &strtab[sym[sym_index].st_name];
    
                symbol_names->push_back(string(sym_name));
            }
            }
    
            /* move pointer to the next entry */
            dyn++;
            }
            }
                }
    
            /* Returning something != 0 stops further iterations,
             * since only the first entry, which is the executable itself, is needed
             * 1 is returned after processing the first entry.
             *
             * If the symbols of all loaded dynamic libs shall be found,
             * the return value has to be changed to 0.
             */
            return 1;
    
            }
    
```

（私はしたいのは、Javaコード）私自身、Javaで翻訳してみました。それは:

```

        if (elf.dynamicTable != null)
            { 
                StringBuilder sb=new StringBuilder();
                Log.v(TAG, "size of dynamic table=" + elf.dynamicTable.length);
                long strtab=0L; //pointer to the string table
                long hash=0L;
                int sym_cnt=0;
                int i=0;
                for (DynamicEntry de=elf.dynamicTable[0];;++i)
                {
                    if (i >= elf.dynamicTable.length)
                        i = 0;
                    de = elf.dynamicTable[i];
                    DynamicEntry.Tag tag=de.getTag();
                    Log.v(TAG, tag.toString());
                    if (tag == null)
                    {
                        Log.v(TAG, "The tag is null");
                        break;
                    }
                    if (de.getTag().equals(DynamicEntry.Tag.NULL))  
                    {
                        Log.v(TAG, "Tag is NULL tag");
                        break;
                    }
                    if (tag.equals(DynamicEntry.Tag.HASH))
                    {
                        hash = de.getValue();
                        /* Get a pointer to the hash */
                        //          hash = (ElfW(Word*))dyn->d_un.d_ptr;
    //
                        /* The 2nd word is the number of symbols */
                        //          sym_cnt = hash[1];
                        //int hashvalue=fileContents[(int)hash]
                        sym_cnt = (fileContents[(int)hash + 1] << 8 | fileContents[(int)hash]);
                        Log.v(TAG, "Hash=" + hash + "cnt=" + sym_cnt);
                    }
                    else if (tag.equals(DynamicEntry.Tag.STRTAB))
                    {
                        strtab = de.getValue();
                        Log.i(TAG, "strtab=" + strtab);
                    }
                    else if (tag.equals(DynamicEntry.Tag.SYMTAB))
                    {
                        if (sym_cnt == 0 || strtab == 0)
                        {
                            continue;
                        }
                        long sym=de.getValue();
                        Log.i(TAG, "sym=" + sym);
                        //      int sym_index=0;
                        for (int sym_index=0;sym_index < sym_cnt;sym_index++)
                        {
                       String sym_name=Elf.getZString(fileContents,(int)strtab + fileContents[(int)(sym + sym_index * 16)]); //get string that ends with NULL from byte array from the offset
                            sb.append(sym_name).append("\n");
                            Log.v(TAG, "sym_nmae=" + sym_name);
                        }
                        break;
                    }
                }
                info = sb.toString();
                Log.i(TAG, "info=" + info);
            }
    
```

期待し、上記のコードを実行させた結果がちょっと変です。

> __cxa_finalize�  
>  __cxa_atexit�  
>  _ZN7_JNIEnv14GetObjectClassEP8_jobject�  
>  __aeabi_unwind_cpp_pr1�  
>  _ZN7_JNIEnv10GetFieldIDEP7_jclassPKcS3_� � Z� � it�  
>  _unwind_cpp_pr1� etFieldIDEP7_jclassPKcS3_� � � �  
>  __cxa_finalize� sEP8_jobject� object� eabi_unwind_cpp_pr1� nd_cpp_pr1�
> p_pr1� N7_JNIEnv10GetFieldIDEP7_jclassPKcS3_� ldIDEP7_jclassPKcS3_�  
>  �(� Z� � � lize� cxa_atexit� 4GetObjectClassEP8_jobject� r1�  
>  IEnv10GetFieldIDEP7_jclassPKcS3_� tFieldIDEP7_jclassPKcS3_�  
>  DEP7_jclassPKcS3_� lassPKcS3_� � � � � � � � u� � � exit�  
>  nv14GetObjectClassEP8_jobject� lassEP8_jobject� � ind_cpp_pr1�  
>  ZN7_JNIEnv10GetFieldIDEP7_jclassPKcS3_� 0GetFieldIDEP7_jclassPKcS3_�  
>  EP7_jclassPKcS3_� sPKcS3_�

変だと思います。

どのようにすればelfファイル内の関数の名前とアドレスを（ファイルオフセット）得と`HashMap <Long, String>`に置くことができますか？

これを試してみたい方は、以下のファイルをダウンロードしてください（apk）

[Githubリリース](https://github.com/KYHSGeekCode/Android-Disassembler/releases)  
[テスト対象のファイル(hello-jni.so)](https://github.com/KYHSGeekCode/Android-
Disassembler/blob/master/Test%20subject%20files/libhello-jni.so)

### 追記

自己回答しましたが、少しでもより良い回答にはお礼を授与します。私が使用される方法は`Dynsym`セクションで有効ですが、###`Symtab`セクションは`StringIndexOutOfBoundsException`で発生したり、ビットを切り捨てます。良い解決策があるかどうか確認してください。ありがとうございます。
CC BY-SA 4.0
2018-10-09T09:36:38.037
49106
2018-10-21T09:45:10.623
2018-10-21T09:45:10.623
30434
30434
question
android java linux array
Elfファイルのdynsymセクションとsymtabセクションの情報を利用して、シンボルの名前とアドレスを取得したいだと思います。
私は`ByteBuffer`と言うことを利用する方法を学びました。これを利用して、私はJavaで記述されたnm似ていることを作ることができました。

次は私のコードです。

```

    byte[] strtable=elf.getDynamicStringTable();
    
            //byte[] symtabs=elf.getDynamicSymbolTable();
            try
            {
                dynsymbuffer=elf.getSection(elf.getSectionHeaderByType(SectionType.DYNSYM));
                ElfClass elfClass=elf.header.elfClass;
                ArrayList<Symbol> dynsyms=new ArrayList<>();
                if(elfClass.equals(ElfClass.CLASS_32))
                {
                    while (dynsymbuffer.hasRemaining())
                    {
                        int name=dynsymbuffer.getInt();
                        int value=dynsymbuffer.getInt();
                        int size=dynsymbuffer.getInt();
                        short stinfo=dynsymbuffer.get();
                        short stother=dynsymbuffer.get();
                        short stshndx=dynsymbuffer.getShort();
                        String sym_name=Elf.getZString(strtable, name);
                        Symbol symbol=new Symbol();
                        symbol.name=sym_name;
                        symbol.is64=false;
                        symbol.st_info=stinfo;
                        symbol.st_name=name;
                        symbol.st_other=stother;
                        symbol.st_shndx=stshndx;
                        symbol.st_size=size;
                        symbol.st_value=value;
                        symbol.analyze();
                        dynsyms.add(symbol);
                        sb.append(symbol.toString()).append(System.lineSeparator());
                    }       
                }else{// 64
                    while (dynsymbuffer.hasRemaining())
                    {
                        int name=dynsymbuffer.getInt();
                        short stinfo=dynsymbuffer.get();
                        short stother=dynsymbuffer.get();
                        short stshndx=dynsymbuffer.getShort();
                        long value=dynsymbuffer.getLong();
                        long size=dynsymbuffer.getLong();   
                        String sym_name=Elf.getZString(strtable, name);
                        Symbol symbol=new Symbol();
                        symbol.name=sym_name;
                        symbol.is64=true;
                        symbol.st_info=stinfo;
                        symbol.st_name=name;
                        symbol.st_other=stother;
                        symbol.st_shndx=stshndx;
                        symbol.st_size=size;
                        symbol.st_value=value;
                        symbol.analyze();
                        dynsyms.add(symbol);
                        sb.append(symbol.toString()).append(System.lineSeparator());
                    }       
                }
            }
            catch(IllegalArgumentException |IOException e)
            {
                Log.e(TAG,"",e);
            }
            sb.append(System.lineSeparator()).append("syms;").append(System.lineSeparator());
            try
            {
                symbuffer=elf.getSection(elf.getSectionHeaderByType(SectionType.SYMTAB));
                ElfClass elfClass=elf.header.elfClass;
                ArrayList<Symbol> syms=new ArrayList<>();
                if(elfClass.equals(ElfClass.CLASS_32))
                {
                    while (symbuffer.hasRemaining())
                    {
                        int name=symbuffer.getInt();
                        int value=symbuffer.getInt();
                        int size=symbuffer.getInt();
                        short stinfo=symbuffer.get();
                        short stother=symbuffer.get();
                        short stshndx=symbuffer.getShort();
                        String sym_name=Elf.getZString(strtable, name);
                        Symbol symbol=new Symbol();
                        symbol.name=sym_name;
                        symbol.is64=false;
                        symbol.st_info=stinfo;
                        symbol.st_name=name;
                        symbol.st_other=stother;
                        symbol.st_shndx=stshndx;
                        symbol.st_size=size;
                        symbol.st_value=value;
                        symbol.analyze();
                        syms.add(symbol);
                            sb.append(symbol.toString()).append(System.lineSeparator());
                    }       
                }else{// 64
                    while (symbuffer.hasRemaining())
                    {
                        int name=symbuffer.getInt();
                        short stinfo=symbuffer.get();
                        short stother=symbuffer.get();
                        short stshndx=symbuffer.getShort();
                        long value=symbuffer.getLong();
                        long size=symbuffer.getLong();  
                        String sym_name=Elf.getZString(strtable, name);
                        Symbol symbol=new Symbol();
                        symbol.name=sym_name;
                        symbol.is64=true;
                        symbol.st_info=stinfo;
                        symbol.st_name=name;
                        symbol.st_other=stother;
                        symbol.st_shndx=stshndx;
                        symbol.st_size=size;
                        symbol.st_value=value;
                        symbol.analyze();
                        syms.add(symbol);
                            sb.append(symbol.toString()).append(System.lineSeparator());
                    }               
                }
            }catch(IllegalArgumentException |IOException|StringIndexOutOfBoundsException e)
            {
                Log.e(TAG,"",e);
            }
    
    class Symbol
        {
            boolean is64;
            long      st_name;
            long      st_value;
            long      st_size;
            short   st_info;
            short  st_other;
            short      st_shndx;
            String name="";
            enum Bind{
                STB_LOCAL,
                STB_GLOBAL,
                STB_WEAK
            };
            enum Type{
                STT_NOTYPE,
                STT_OBJECT,
                STT_FUNC,
                STT_SECTION,
                STT_FILE,
                STT_COMMON
            };
            Bind bind;
            Type type;
            public void analyze()
            {
                bind=Bind.values()[st_info>>4];
                type=Type.values()[st_info&0xf];
                return;
            }
            @Override
            public String toString()
            {
                StringBuilder sb=new StringBuilder();
                sb.append(name).append(" at ").append(Long.toHexString(st_value))
                    .append(" with size ").append(st_size).append(" binding=")
                    .append(bind).append("&type=").append(type)
                    .append(" at section #").append(st_shndx);
    
                return sb.toString();
            }
    
        }
    
```

上記のいくつかのメソッドは、[java-binutils](https://github.com/jawi/java-
binutils)というライブラリで提供されるメソッドです。

  * elf.getSection()

  * elf.getSectionHeaderByType()

  * elf.getDynamicStringTable()

  * elf.getZString()

`elf.getZString`は、そのライブラリのprivateメソッドをpublicに変え使用した非常に便利なメソッドです。これ的まるで、C言語での`null`で終わる文字列を作成します。

うまく動作する完全なコードを見てたい場合、ここ[ギっハブリンク](https://github.com/KYHSGeekCode/Android-
Disassembler/blob/master/app/src/main/java/com/kyhsgeekcode/disassembler/ELFUtil.java)を見てください。

**修正**  
`symtab`セクションが`dynsym`セクションが含まれているとします。したがってsymtabセクションだけ調べてもなりそうです。

上記のコードの実行結果例です。

```

    =0;size=0;0;0
    __cxa_finalize=0;size=0;18;0
    __cxa_atexit=0;size=0;18;0
    _ZN7_JNIEnv14GetObjectClassEP8_jobject=12b28;size=64;34;8
    __aeabi_unwind_cpp_pr1=f4db4;size=8;34;8
    _ZN7_JNIEnv10GetFieldIDEP7_jclassPKcS3_=12b68;size=80;34;8
    _ZN7_JNIEnv14GetObjectFieldEP8_jobjectP9_jfieldID=12bb8;size=72;34;8
    _ZN7_JNIEnv14SetObjectFieldEP8_jobjectP9_jfieldIDS1_=12c00;size=68;34;8
    _ZN7_JNIEnv11SetIntFieldEP8_jobjectP9_jfieldIDi=12c44;size=68;34;8
    _ZN7_JNIEnv12SetLongFieldEP8_jobjectP9_jfieldIDx=12c88;size=68;34;8
    _ZN7_JNIEnv12NewStringUTFEPKc=12ccc;size=64;34;8
    _ZN7_JNIEnv14GetArrayLengthEP7_jarray=12d0c;size=64;34;8
    _ZN7_JNIEnv20GetByteArrayElementsEP11_jbyteArrayPh=12d4c;size=72;34;8
    _ZN7_JNIEnv24ReleaseByteArrayElementsEP11_jbyteArrayPai=12d94;size=68;34;8 handle=1916d0;size=4;17;19
    Java_com_jourhyang_disasmarm_MainActivity_disassemble=12dd8;size=708;18;8
    _Znaj=c507d;size=20;18;8 cs_disasm=15034;size=1932;18;8 asprintf=0;size=0;18;0 free=0;size=0;18;0 cs_free=15814;size=168;18;8
    __stack_chk_fail=0;size=0;18;0
    __stack_chk_guard=0;size=0;17;0 Java_com_jourhyang_disasmarm_DisasmResult_DisasmOne=1309c;size=208;18;8
    DisasmOne_sub=1327c;size=1084;18;8
    Java_com_jourhyang_disasmarm_DisasmResult_DisasmOne2=1316c;size=272;18;8
    __android_log_print=0;size=0;18;0 errmsg=136b8;size=340;18;8
    __aeabi_unwind_cpp_pr0=f4dac;size=8;18;8 Java_com_jourhyang_disasmarm_MainActivity_Init=1380c;size=292;18;8
    cs_option=14d28;size=456;18;8 cs_open=147f4;size=476;18;8
    malloc=0;size=0;18;0 calloc=0;size=0;18;0 vsnprintf=0;size=0;18;0
    realloc=0;size=0;18;0
    Java_com_jourhyang_disasmarm_MainActivity_Finalize=13930;size=60;18;8
    cs_close=149d0;size=204;18;8 cs_reg_name=15db0;size=104;18;8
    arch_init=1916d4;size=32;17;19 arch_option=1916f4;size=32;17;19
    arch_destroy=191714;size=32;17;19 ARM_enable=17e84;size=148;18;8
    AArch64_enable=18090;size=148;18;8 all_arch=191734;size=4;17;19
    cs_mem_malloc=191738;size=4;17;19 cs_mem_calloc=19173c;size=4;17;19
    cs_mem_realloc=191740;size=4;17;19 cs_mem_free=191744;size=4;17;19
    cs_vsnprintf=191748;size=4;17;19 cs_version=14558;size=88;18;8
    cs_support=145b0;size=212;18;8 cs_errno=14684;size=68;18;8
    cs_strerror=146c8;size=300;18;8 memset=0;size=0;18;0
    memcpy=0;size=0;18;0 MCInst_getOpcodePub=16dc8;size=40;18;8
    strncpy=0;size=0;18;0 cs_snprintf=17bb4;size=164;18;8
    MCInst_Init=16c08;size=88;18;8 SStream_Init=17240;size=52;18;8
    cs_disasm_ex=157c0;size=84;18;8 cs_malloc=158bc;size=232;18;8
    cs_disasm_iter=159a4;size=1036;18;8 cs_insn_name=15e18;size=104;18;8
    cs_group_name=15e80;size=104;18;8 cs_insn_group=15f68;size=220;18;8
    cs_reg_read=16044;size=220;18;8 cs_reg_write=16120;size=220;18;8
    cs_op_count=161fc;size=1188;18;8 cs_op_index=166a0;size=1384;18;8
    MCInst_clear=16c60;size=40;18;8 MCInst_insert0=16c88;size=192;18;8
    MCInst_setOpcode=16d48;size=44;18;8
    MCInst_setOpcodePub=16d74;size=44;18;8
    MCInst_getOpcode=16da0;size=40;18;8
    MCInst_getOperand=16df0;size=56;18;8
    MCInst_getNumOperands=16e28;size=40;18;8
    MCInst_addOperand2=16e50;size=100;18;8
    MCOperand_Init=16eb4;size=56;18;8 MCOperand_isValid=16eec;size=56;18;8
    MCOperand_isReg=16f24;size=56;18;8 MCOperand_isImm=16f5c;size=56;18;8
    MCOperand_isFPImm=16f94;size=56;18;8
    MCOperand_getReg=16fcc;size=40;18;8
    MCOperand_setReg=16ff4;size=44;18;8
    MCOperand_getImm=17020;size=44;18;8
    MCOperand_setImm=1704c;size=44;18;8
    MCOperand_getFPImm=17078;size=44;18;8
    MCOperand_setFPImm=170a4;size=44;18;8
    MCOperand_CreateReg1=170d0;size=76;18;8
    MCOperand_CreateReg0=1711c;size=108;18;8
    MCOperand_CreateImm1=17188;size=76;18;8
    MCOperand_CreateImm0=171d4;size=108;18;8
    SStream_concat0=17274;size=128;18;8 strlen=0;size=0;18;0
    SStream_concat=172f4;size=212;18;8 printInt64Bang=173c8;size=216;18;8
    printUInt64Bang=174a0;size=104;18;8 printInt64=17508;size=216;18;8
    printInt32BangDec=175e0;size=108;18;8
    printInt32Bang=1764c;size=204;18;8 printInt32=17718;size=204;18;8
    printUInt32Bang=177e4;size=100;18;8 printUInt32=17848;size=100;18;8
    insn_find=1799c;size=172;18;8 name2id=17a48;size=148;18;8
    strcmp=0;size=0;18;0 count_positive=17adc;size=84;18;8
    cs_strdup=17b30;size=132;18;8 memmove=0;size=0;18;0
    ARM_init=53b64;size=160;18;8 ARM_getRegName=6a41c;size=140;18;8
    ARM_printInst=6b33c;size=5272;18;8 ARM_reg_name=76c40;size=84;18;8
    ARM_get_insn_id=76ce8;size=956;18;8 ARM_insn_name=770a4;size=88;18;8
    ARM_group_name=770fc;size=156;18;8
    ARM_post_printer=6a758;size=3044;18;8
    Thumb_getInstruction=55318;size=104;18;8
    ARM_getInstruction=55380;size=104;18;8
    AArch64_init=942ac;size=160;18;8
    AArch64_printInst=95360;size=6536;18;8
    AArch64_getInstruction=90f0c;size=112;18;8
    AArch64_reg_name=c3a30;size=84;18;8
    AArch64_get_insn_id=c3a84;size=956;18;8
    AArch64_insn_name=c3e40;size=204;18;8
    AArch64_group_name=c3f0c;size=156;18;8
    AArch64_post_printer=c39d0;size=96;18;8
    ARM_getFeatureBits=185e8;size=220;18;8
    MCRegisterInfo_InitMCRegisterInfo=c43e4;size=196;18;8
    MCOperandInfo_isOptionalDef=c43a8;size=60;18;8
    MCOperandInfo_isPredicate=c436c;size=60;18;8
    ARM_addReg=76a5c;size=208;18;8
    ARM_addVectorDataType=769cc;size=72;18;8
    ARM_addVectorDataSize=76a14;size=72;18;8
    ARM_addUserMode=76b2c;size=68;18;8 ARM_reg_name2=76c94;size=84;18;8
    strrchr=0;size=0;18;0 strncmp=0;size=0;18;0
    MCRegisterInfo_getRegClass=c48a8;size=96;18;8
    MCRegisterClass_contains=c4908;size=144;18;8
    MCRegisterInfo_getMatchingSuperReg=c45ec;size=356;18;8
    ARM_rel_branch=77198;size=132;18;8
    ARM_blx_to_arm_mode=7721c;size=132;18;8
    MCRegisterInfo_getSubReg=c4750;size=344;18;8
    ARM_addSysReg=76b70;size=208;18;8
    A64SysRegMapper_toString=c4d34;size=840;18;8
    AArch64_MRSMapper=1915d0;size=12;17;18
    AArch64_MSRMapper=191634;size=12;17;18
    A64NamedImmMapper_toString=c4998;size=176;18;8
    A64PState_PStateMapper=1912e4;size=12;17;18
    __aeabi_idivmod=f4168;size=32;18;8 AArch64_map_insn=c3fa8;size=132;18;8 strstr=0;size=0;18;0
    AArch64_map_vregister=c402c;size=172;18;8
    A64PRFM_PRFMMapper=1912c0;size=12;17;18
    A64ISB_ISBMapper=191224;size=12;17;18
    A64DB_DBarrierMapper=1911a0;size=12;17;18
    arm64_op_addVectorArrSpecifier=c40d8;size=116;18;8
    arm64_op_addFP=c41c0;size=212;18;8
    arm64_op_addVectorElementSizeSpecifier=c414c;size=116;18;8
    arm64_op_addImm=c4294;size=216;18;8 tolower=0;size=0;18;0
    A64NamedImmMapper_fromString=c4b04;size=184;18;8
    A64NamedImmMapper_validImm=c4bbc;size=64;18;8
    __aeabi_uldivmod=f4188;size=0;18;8 strcpy=0;size=0;18;0 A64TLBI_TLBIMapper=1910c8;size=12;17;18
    A64AT_ATMapper=191134;size=12;17;18
    A64DC_DCMapper=1911ec;size=12;17;18
    A64IC_ICMapper=191210;size=12;17;18
    _Znwj=c7b85;size=84;18;8
    __cxa_end_cleanup=c6e19;size=0;18;8
    __cxa_call_unexpected=c7011;size=256;18;8
    _ZTISt9bad_alloc=114d28;size=12;17;14 memcmp=0;size=0;18;0 memchr=0;size=0;18;0
    _ZdlPv=c6e15;size=4;18;8
    __cxa_begin_catch=c7115;size=142;18;8
    __cxa_end_catch=c71a5;size=140;18;8
    _ZNKSt9bad_alloc4whatEv=c6dd9;size=12;18;8
    _ZNSt9bad_allocD2Ev=c6de5;size=28;18;8
    _ZNSt9exceptionD2Ev=c7241;size=2;18;8
    _ZTVSt9bad_alloc=114d38;size=20;17;14
    _ZNSt9bad_allocD1Ev=c6de5;size=28;18;8
    _ZNSt9bad_allocD0Ev=c6e01;size=18;18;8
    _ZTSSt9bad_alloc=110b88;size=13;17;11
    _ZTVN10__cxxabiv120__si_class_type_infoE=114dd8;size=44;17;14
    _ZTISt9exception=114d58;size=8;17;14
    __gnu_end_cleanup=c6f45;size=112;18;8
    _Unwind_Resume=f5238;size=36;18;8
    __cxa_type_match=c6e25;size=188;18;8
    _ZTIN10__cxxabiv119__foreign_exceptionE=114d84;size=8;17;14
    _ZTIN10__cxxabiv115__forced_unwindE=114d50;size=8;17;14
    __cxa_begin_cleanup=c6ee1;size=100;18;8
    __cxa_get_globals=c7339;size=92;18;8
    _ZSt9terminatev=c79dd;size=12;18;8
    _ZN10__cxxabiv111__terminateEPFvvE=c796d;size=40;18;8
    _ZN10__cxxabiv112__unexpectedEPFvvE=c79e9;size=10;18;8
    _ZSt10unexpectedv=c7a3d;size=12;18;8
    __cxa_get_globals_fast=c730d;size=44;18;8
    __cxa_rethrow=c7b11;size=114;18;8
    __cxa_allocate_exception=c8e99;size=152;18;8
    __cxa_throw=c7a91;size=128;18;8
    _ZTISt13bad_exception=114d78;size=12;17;14
    _ZTVSt13bad_exception=114d60;size=20;17;14
    _ZNSt13bad_exceptionD1Ev=c7245;size=28;18;8
    __cxa_get_exception_ptr=c7111;size=4;18;8
    _Unwind_Complete=f47d0;size=4;18;8
    _Unwind_DeleteException=f47d4;size=24;18;8
    _ZSt18uncaught_exceptionv=c7231;size=16;18;8
    _ZNSt9exceptionD1Ev=c7241;size=2;18;8
    _ZNSt13bad_exceptionD2Ev=c7245;size=28;18;8
    _ZNKSt9exception4whatEv=c7261;size=12;18;8
    _ZNKSt13bad_exception4whatEv=c726d;size=12;18;8
    _ZNSt9exceptionD0Ev=c7279;size=18;18;8
    _ZNSt13bad_exceptionD0Ev=c728d;size=18;18;8
    _ZN10__cxxabiv115__forced_unwindD2Ev=c72a1;size=2;18;8
    _ZN10__cxxabiv115__forced_unwindD1Ev=c72a1;size=2;18;8
    _ZN10__cxxabiv115__forced_unwindD0Ev=c72a5;size=18;18;8
    _ZN10__cxxabiv119__foreign_exceptionD2Ev=c72b9;size=2;18;8
    _ZN10__cxxabiv119__foreign_exceptionD1Ev=c72b9;size=2;18;8
    _ZN10__cxxabiv119__foreign_exceptionD0Ev=c72bd;size=18;18;8
    _ZTSSt9exception=110bdc;size=13;17;11
    _ZTSSt13bad_exception=110bec;size=18;17;11
    _ZTSN10__cxxabiv115__forced_unwindE=110b98;size=32;17;11
    _ZTSN10__cxxabiv119__foreign_exceptionE=110bb8;size=36;17;11
    _ZTVSt9exception=114dc0;size=20;17;14
    _ZTVN10__cxxabiv115__forced_unwindE=114d90;size=20;17;14
    _ZTVN10__cxxabiv119__foreign_exceptionE=114da8;size=20;17;14
    _ZTVN10__cxxabiv117__class_type_infoE=114fc8;size=44;17;14
    __cxa_pure_virtual=c7bd9;size=24;18;8 pthread_key_delete=0;size=0;18;0 pthread_getspecific=0;size=0;18;0 pthread_setspecific=0;size=0;18;0
    pthread_key_create=0;size=0;18;0 abort=0;size=0;18;0
    _Unwind_GetDataRelBase=f5758;size=8;18;8
    _Unwind_GetTextRelBase=f5760;size=8;18;8
    _Unwind_GetRegionStart=f572c;size=16;18;8
    _Unwind_VRS_Set=f4870;size=92;18;8
    _Unwind_GetLanguageSpecificData=f573c;size=28;18;8
    _Unwind_VRS_Get=f47ec;size=92;18;8
    __gnu_unwind_frame=f56ec;size=64;18;8
    _ZSt13set_terminatePFvvE=c7995;size=44;18;8
    _ZN10__cxxabiv119__terminate_handlerE=191650;size=4;17;18
    _ZSt13get_terminatev=c79c1;size=28;18;8
    _ZSt14set_unexpectedPFvvE=c79f5;size=44;18;8
    _ZN10__cxxabiv120__unexpected_handlerE=191640;size=4;17;18
    _ZSt14get_unexpectedv=c7a21;size=28;18;8
    __cxa_free_exception=c8f31;size=120;18;8
    _Unwind_RaiseException=f5214;size=36;18;8
    _Unwind_Resume_or_Rethrow=f525c;size=36;18;8
    _ZSt15get_new_handlerv=c949d;size=16;18;8 write=0;size=0;18;0
    __cxa_deleted_virtual=c7bf1;size=24;18;8
    _ZN10__cxxabiv120__si_class_type_infoD2Ev=c7c09;size=28;18;8
    _ZN10__cxxabiv117__class_type_infoD2Ev=c8d0d;size=28;18;8
    _ZN10__cxxabiv120__si_class_type_infoD1Ev=c7c09;size=28;18;8
    _ZN10__cxxabiv120__si_class_type_infoD0Ev=c7c25;size=18;18;8
    _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_=c7c39;size=58;18;8
    _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE=c7c75;size=144;18;8
    _ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE=c7d05;size=42;18;8
    _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE=c8d3d;size=24;18;8
    _ZTSN10__cxxabiv120__si_class_type_infoE=110c00;size=37;17;11
    _ZTIN10__cxxabiv120__si_class_type_infoE=114e08;size=12;17;14
    _ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj=c8d55;size=42;18;8
    _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv=c8ccd;size=50;18;8
    _ZTIN10__cxxabiv117__class_type_infoE=114ff8;size=12;17;14
    _ZTVSt8bad_cast=114f88;size=20;17;14
    _ZTISt8bad_cast=114f78;size=12;17;14
    _ZNSt8bad_castD1Ev=c8c61;size=28;18;8
    _ZTVSt10bad_typeid=114fa0;size=20;17;14
    _ZTISt10bad_typeid=114fb8;size=12;17;14
    _ZNSt10bad_typeidD1Ev=c8c9d;size=28;18;8
    __cxa_guard_acquire=c9321;size=216;18;8
    __cxa_guard_release=c943d;size=64;18;8
    _ZNSt15__exception_ptr13exception_ptrC1Ev=c9109;size=6;18;8
    _ZNSt15__exception_ptr13exception_ptrD1Ev=c91a5;size=12;18;8 strerror=0;size=0;18;0
    _ZNKSt8bad_cast4whatEv=c8c55;size=12;18;8
    _ZNSt8bad_castD2Ev=c8c61;size=28;18;8
    _ZNSt8bad_castD0Ev=c8c7d;size=18;18;8
    _ZTSSt8bad_cast=110d44;size=12;17;11
    _ZNKSt10bad_typeid4whatEv=c8c91;size=12;18;8
    _ZNSt10bad_typeidD2Ev=c8c9d;size=28;18;8
    _ZNSt10bad_typeidD0Ev=c8cb9;size=18;18;8
    _ZTSSt10bad_typeid=110d50;size=15;17;11
    _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_=c8d01;size=12;18;8
    _ZN10__cxxabiv117__class_type_infoD1Ev=c8d0d;size=28;18;8
    _ZN10__cxxabiv117__class_type_infoD0Ev=c8d29;size=18;18;8
    _ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE=c8d81;size=64;18;8
    _ZTSN10__cxxabiv117__class_type_infoE=110d60;size=34;17;11 pthread_mutex_lock=0;size=0;18;0 pthread_mutex_unlock=0;size=0;18;0
    __cxa_allocate_dependent_exception=c8fa9;size=140;18;8
    __cxa_free_dependent_exception=c9035;size=128;18;8
    _ZNSt15__exception_ptr13exception_ptr18_M_safe_bool_dummyEv=c90b5;size=2;18;8
    _ZNSt15__exception_ptr13exception_ptrC2Ev=c9109;size=6;18;8
    _ZNSt15__exception_ptr13exception_ptrC2EMS0_FvvE=c9111;size=22;18;8
    _ZNSt15__exception_ptr13exception_ptrC1EMS0_FvvE=c9111;size=22;18;8
    _ZNSt15__exception_ptr13exception_ptr9_M_addrefEv=c9129;size=30;18;8
    _ZNSt15__exception_ptr13exception_ptrC2EPv=c9149;size=14;18;8
    _ZNSt15__exception_ptr13exception_ptrC1EPv=c9149;size=14;18;8
    _ZNSt15__exception_ptr13exception_ptrC2ERKS0_=c9159;size=16;18;8
    _ZNSt15__exception_ptr13exception_ptrC1ERKS0_=c9159;size=16;18;8
    _ZNSt15__exception_ptr13exception_ptr10_M_releaseEv=c9169;size=60;18;8
    _ZNSt15__exception_ptr13exception_ptrD2Ev=c91a5;size=12;18;8
    _ZNKSt15__exception_ptr13exception_ptr6_M_getEv=c91b1;size=4;18;8
    _ZNSt15__exception_ptr13exception_ptr4swapERS0_=c91b5;size=10;18;8
    _ZNSt15__exception_ptr13exception_ptraSERKS0_=c91c1;size=34;18;8
    _ZNKSt15__exception_ptr13exception_ptrntEv=c91e5;size=10;18;8
    _ZNKSt15__exception_ptr13exception_ptrcvMS0_FvvEEv=c91f1;size=28;18;8
    _ZNKSt15__exception_ptr13exception_ptr20__cxa_exception_typeEv=c920d;size=8;18;8
    _ZNSt15__exception_ptreqERKNS_13exception_ptrES2_=c9215;size=14;18;8
    _ZNSt15__exception_ptrneERKNS_13exception_ptrES2_=c9225;size=14;18;8
    _ZSt17current_exceptionv=c9235;size=106;18;8
    _ZSt17rethrow_exceptionNSt15__exception_ptr13exception_ptrE=c92a1;size=128;18;8
    _ZN9__gnu_cxx27__verbose_terminate_handlerEv=c94ad;size=300;18;8
    __google_potentially_blocking_region_begin=0;size=0;32;0
    __google_potentially_blocking_region_end=0;size=0;32;0 syscall=0;size=0;18;0
    __cxa_guard_abort=c93f9;size=66;18;8
    _ZSt15set_new_handlerPFvvE=c947d;size=32;18;8
    _ZSt7nothrow=110dd8;size=1;17;11
    __cxa_current_exception_type=f1ac1;size=26;18;8
    __cxa_demangle=f1861;size=208;18;8 fwrite=0;size=0;18;0 fputs=0;size=0;18;0 fputc=0;size=0;18;0
    __sF=0;size=0;17;0
    _ZdaPv=f1955;size=4;18;8 setlocale=0;size=0;18;0 vsprintf=0;size=0;18;0
    __dynamic_cast=f1959;size=166;18;8
    __cxa_bad_cast=f1a01;size=48;18;8
    _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPi=f2241;size=232;18;8
    _ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKPi=f2079;size=228;18;8
    _ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPi=f2161;size=220;18;8
    __aeabi_uidiv=f3fc4;size=0;18;8
    __aeabi_idiv=f408c;size=0;18;8
    _ZTVN10__cxxabiv121__vmi_class_type_infoE=115838;size=44;17;14 pthread_once=0;size=0;18;0 wmemcpy=0;size=0;18;0
    strftime=0;size=0;18;0 wcsftime=0;size=0;18;0 wcslen=0;size=0;18;0
    wmemset=0;size=0;18;0 wmemchr=0;size=0;18;0 wmemmove=0;size=0;18;0
    wmemcmp=0;size=0;18;0 sprintf=0;size=0;18;0
    __gcclibcxx_demangle_callback=f1931;size=34;18;8
    __cxa_bad_typeid=f1a31;size=48;18;8
    __cxa_throw_bad_array_new_length=f1a61;size=48;18;8
    _ZTVSt20bad_array_new_length=115ad8;size=20;17;14
    _ZTISt20bad_array_new_length=115af0;size=12;17;14
    _ZNSt20bad_array_new_lengthD1Ev=f3f95;size=28;18;8
    __cxa_throw_bad_array_length=f1a91;size=48;18;8
    _ZTVSt16bad_array_length=115ab0;size=20;17;14
    _ZTISt16bad_array_length=115ac8;size=12;17;14
    _ZNSt16bad_array_lengthD1Ev=f3f59;size=28;18;8
    _ZN10__cxxabiv121__vmi_class_type_infoD2Ev=f1add;size=28;18;8
    _ZN10__cxxabiv121__vmi_class_type_infoD1Ev=f1add;size=28;18;8
    _ZN10__cxxabiv121__vmi_class_type_infoD0Ev=f1af9;size=18;18;8
    _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_=f1b0d;size=136;18;8
    _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE=f1b95;size=896;18;8
    _ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE=f1f15;size=354;18;8
    _ZTSN10__cxxabiv121__vmi_class_type_infoE=112604;size=38;17;11
    _ZTIN10__cxxabiv121__vmi_class_type_infoE=115868;size=12;17;14 strtod=0;size=0;18;0 sscanf=0;size=0;18;0 wcrtomb=0;size=0;18;0
    mbrtowc=0;size=0;18;0 strcoll=0;size=0;18;0 strxfrm=0;size=0;18;0
    wcscoll=0;size=0;18;0 wcsxfrm=0;size=0;18;0
    _ctype_=0;size=0;17;0 wctype=0;size=0;18;0 towupper=0;size=0;18;0 towlower=0;size=0;18;0 iswctype=0;size=0;18;0 wctob=0;size=0;18;0
    btowc=0;size=0;18;0
    _ZNKSt16bad_array_length4whatEv=f3f4d;size=12;18;8
    _ZNSt16bad_array_lengthD2Ev=f3f59;size=28;18;8
    _ZNSt16bad_array_lengthD0Ev=f3f75;size=18;18;8
    _ZTSSt16bad_array_length=1126bc;size=21;17;11
    _ZNKSt20bad_array_new_length4whatEv=f3f89;size=12;18;8
    _ZNSt20bad_array_new_lengthD2Ev=f3f95;size=28;18;8
    _ZNSt20bad_array_new_lengthD0Ev=f3fb1;size=18;18;8
    _ZTSSt20bad_array_new_length=1126d4;size=25;17;11
    __udivsi3=f3fc4;size=168;18;8
    __aeabi_idiv0=f41c4;size=16;34;8
    __aeabi_uidivmod=f406c;size=32;18;8
    __divsi3=f408c;size=220;18;8
    __aeabi_ldiv0=f41c4;size=16;34;8
    __gnu_uldivmod_helper=f4210;size=60;18;8 raise=0;size=0;18;0
    __gnu_ldivmod_helper=f41d4;size=60;18;8
    __divdi3=f5768;size=400;18;8
    __udivdi3=f58f8;size=272;18;8
    __aeabi_unwind_cpp_pr2=f4dbc;size=8;34;8
    __gnu_Unwind_Find_exidx=0;size=0;34;0
    __gnu_Unwind_Restore_VFP_D=f5144;size=0;18;8
    __gnu_Unwind_Restore_VFP=f5134;size=0;18;8
    __gnu_Unwind_Restore_VFP_D_16_to_31=f5154;size=0;18;8
    __gnu_Unwind_Restore_WMMXD=f5164;size=0;18;8
    __gnu_Unwind_Restore_WMMXC=f51ec;size=0;18;8 restore_core_regs=f5120;size=20;18;8
    _Unwind_GetCFA=f4674;size=8;18;8
    __gnu_Unwind_RaiseException=f467c;size=164;18;8
    __gnu_Unwind_ForcedUnwind=f4720;size=28;18;8
    __gnu_Unwind_Resume=f473c;size=116;18;8
    __gnu_Unwind_Resume_or_Rethrow=f47b0;size=32;18;8
    __gnu_Unwind_Backtrace=f48f8;size=200;18;8
    __gnu_unwind_execute=f5354;size=920;18;8
    _Unwind_VRS_Pop=f4dc4;size=860;18;8
    __gnu_Unwind_Save_VFP_D=f514c;size=0;18;8
    __gnu_Unwind_Save_VFP=f513c;size=0;18;8
    __gnu_Unwind_Save_VFP_D_16_to_31=f515c;size=0;18;8
    __gnu_Unwind_Save_WMMXD=f51a8;size=0;18;8
    __gnu_Unwind_Save_WMMXC=f5200;size=0;18;8
    __restore_core_regs=f5120;size=20;18;8
    ___Unwind_RaiseException=f5214;size=36;18;8
    ___Unwind_Resume=f5238;size=36;18;8
    ___Unwind_Resume_or_Rethrow=f525c;size=36;18;8
    ___Unwind_ForcedUnwind=f5280;size=36;18;8
    _Unwind_ForcedUnwind=f5280;size=36;18;8
    ___Unwind_Backtrace=f52a4;size=36;18;8
    _Unwind_Backtrace=f52a4;size=36;18;8
    __aeabi_llsl=f5a24;size=28;18;8
    __aeabi_llsr=f5a08;size=28;18;8
    __lshrdi3=f5a08;size=28;18;8
    __ashldi3=f5a24;size=28;18;8
    _edata=1916d0;size=0;16;-15
    __bss_start=1916d0;size=0;16;-15
    _end=19755c;size=0;16;-15
    
```
CC BY-SA 4.0
2018-10-15T15:09:09.993
49316
2018-10-18T13:03:35.100
2018-10-18T13:03:35.100
30434
30434
49106
answer