serge1 / ELFIO

ELFIO - ELF (Executable and Linkable Format) reader and producer implemented as a header only C++ library

Home Page:http://serge1.github.io/ELFIO

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Separate reader and writer

jrmadsen opened this issue · comments

Hi, I've been experimenting with ELFIO and I have more-or-less trying to read in an ELF and the write out again using a separate instance of ELFIO::elfio but there appears to be an issue with the headers.:

// error checking and asserts omitted in the interest of brevity

using Section = ELFIO::section;
using Segment = ELFIO::segment;

void read_write(std::string in, std::string out)
{
    ELFIO::elfio reader{};
    ELFIO::elfio writer{};

    reader.load(in);

    writer.create(reader.get_class(), reader.get_encoding());
    writer.set_os_abi(reader.get_os_abi());
    writer.set_type(reader.get_type());
    writer.set_machine(reader.get_machine());
    writer.set_abi_version(reader.get_abi_version());
    
    std::vector<std::pair<Section*, Section*>> _sections{};
    std::vector<std::pair<Segment*, Segment*>> _segments{};

    for(size_t i = 0; i < reader.sections.size(); ++i)
        _sections.emplace_back(reader.sections[i],
                               writer.sections.add(reader.sections[i]->get_name()));

    for(size_t i = 0; i < reader.segments.size(); ++i)
        _segments.emplace_back(reader.segments[i], writer.segments.add());

    for(auto& itr : _sections)
    {
        auto* _read  = itr.first;
        auto* _write = itr.second;

        _write->set_type(_read->get_type());
        _write->set_flags(_read->get_flags());
        _write->set_addr_align(_read->get_addr_align());
        _write->set_link(_read->get_link());
        _write->set_info(_read->get_info());
        _write->set_entry_size(_read->get_entry_size());
        _write->set_name_string_offset(_read->get_name_string_offset());
        _write->set_data(_read->get_data(), _read->get_size());
    }

    for(auto& itr : _segments)
    {
        auto* _read  = itr.first;
        auto* _write = itr.second;

        _write->set_type(_read->get_type());
        _write->set_flags(_read->get_flags());
        _write->set_align(_read->get_align());
        for(size_t i = 0; i < _read->get_sections_num(); ++i)
        {
            Section* _read_sec = reader.sections[_read->get_section_index_at(i)];
            auto witr =
                std::find_if(writer.sections.begin(), writer.sections.end(),
                             [_read_sec](const ELFIO::section* _wsec) {
                                 return _wsec->get_name() == _read_sec->get_name();
                             });
            Section* _write_sec = *witr;
            _write->add_section(_write_sec, _write_sec->get_addr_align());
        }
    }

    writer.set_entry(reader.get_entry());

    writer.save(_out);
}

However, the ELF is invalid. Here is a diff of readelf -a -W exe vs. readelf -a -W exe.mod:

$ readelf -a -W ./exe &> dump.exe && readelf -a -W ./exe.mod &> dump.exe.mod && diff -y -W 200 ./dump.exe ./dump.exe.mod
ELF Header:                                                                                             ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00                                                Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64                                                                Class:                             ELF64
  Data:                              2's complement, little endian                                        Data:                              2's complement, little endian
  Version:                           1 (current)                                                          Version:                           1 (current)
  OS/ABI:                            UNIX - System V                                                      OS/ABI:                            UNIX - System V
  ABI Version:                       0                                                                    ABI Version:                       0
  Type:                              EXEC (Executable file)                                               Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64                                        Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1                                                                  Version:                           0x1
  Entry point address:               0x242a10                                                             Entry point address:               0x242a10
  Start of program headers:          64 (bytes into file)                                                 Start of program headers:          64 (bytes into file)
  Start of section headers:          338336 (bytes into file)                                      |      Start of section headers:          350396 (bytes into file)
  Flags:                             0x0                                                                  Flags:                             0x0
  Size of this header:               64 (bytes)                                                           Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)                                                           Size of program headers:           56 (bytes)
  Number of program headers:         11                                                                   Number of program headers:         11
  Size of section headers:           64 (bytes)                                                           Size of section headers:           64 (bytes)
  Number of section headers:         36                                                            |      Number of section headers:         38
  Section header string table index: 34                                                            |      Section header string table index: 1

Section Headers:                                                                                        Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al                  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0                  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        00000000002002a8 0002a8 00001c 00   A  0   0  1           |      [ 1] .shstrtab         STRTAB          0000000000000000 045088 00016a 00      0   0  1
  [ 2] .note.ABI-tag     NOTE            00000000002002c4 0002c4 000020 00   A  0   0  4           |      [ 2]                   NULL            0000000000000000 0451f2 000000 00      0   0  0
  [ 3] .dynsym           DYNSYM          00000000002002e8 0002e8 000198 18   A  7   1  8           |      [ 3] .shstrtab         PROGBITS        0000000000000000 001000 00001c 00   A  0   0  1
  [ 4] .gnu.version      VERSYM          0000000000200480 000480 000022 02   A  3   0  2           |      [ 4] b                 NOTE            000000000000001c 00101c 000020 00   A  0   0  4
  [ 5] .gnu.version_r    VERNEED         00000000002004a4 0004a4 000040 00   A  7   2  4           |    readelf: Warning: [ 5]: Link field (7) should index a string section.
  [ 6] .gnu.hash         GNU_HASH        00000000002004e8 0004e8 00001c 00   A  3   0  8           |      [ 5] te.ABI-tag        DYNSYM          0000000000000040 001040 000198 18   A  7   1  8
  [ 7] .dynstr           STRTAB          0000000000200504 000504 0001d5 00   A  0   0  1           |    readelf: Warning: [ 6]: Link field (3) should index a symtab section.
  [ 8] .rela.dyn         RELA            00000000002006e0 0006e0 000030 18   A  3   0  8           |      [ 6] ag                VERSYM          00000000000001d8 0011d8 000022 02   A  3   0  2
  [ 9] .rela.plt         RELA            0000000000200710 000710 000120 18  AI  3  25  8           |    readelf: Warning: [ 7]: Link field (7) should index a string section.
  [10] .rodata           PROGBITS        0000000000200830 000830 000049 00 AMS  0   0  4           |      [ 7] nu.version        VERNEED         00000000000001fc 0011fc 000040 00   A  7   2  4
  [11] .hip_fatbin       PROGBITS        0000000000201000 001000 040779 00   A  0   0 4096         |    readelf: Warning: [ 8]: Link field (3) should index a symtab section.
  [12] .hipFatBinSegment PROGBITS        0000000000241780 041780 000030 00   A  0   0  8           |      [ 8] .version_r        GNU_HASH        0000000000000240 001240 00001c 00   A  3   0  8
  [13] .eh_frame_hdr     PROGBITS        00000000002417b0 0417b0 00007c 00   A  0   0  4           |      [ 9]                   STRTAB          000000000000025c 00125c 0001d5 00   A  0   0  1
  [14] .eh_frame         PROGBITS        0000000000241830 041830 0001d4 00   A  0   0  8           |    readelf: Warning: [10]: Link field (3) should index a symtab section.
  [15] .text             PROGBITS        0000000000242a10 041a10 000522 00  AX  0   0 16           |      [10] sh                RELA            0000000000000438 001438 000030 18   A  3   0  8
  [16] .init             PROGBITS        0000000000242f34 041f34 00001b 00  AX  0   0  4           |    readelf: Warning: [11]: Link field (3) should index a symtab section.
  [17] .fini             PROGBITS        0000000000242f50 041f50 00000d 00  AX  0   0  4           |      [11]                   RELA            0000000000000468 001468 000120 18  AI  3  25  8
  [18] .plt              PROGBITS        0000000000242f60 041f60 0000d0 00  AX  0   0 16           |      [12]                   PROGBITS        0000000000000588 001588 000049 00 AMS  0   0  4
  [19] .fini_array       FINI_ARRAY      0000000000244030 042030 000008 08  WA  0   0  8           |      [13] lt                PROGBITS        0000000000001000 002000 040779 00   A  0   0 4096
  [20] .init_array       INIT_ARRAY      0000000000244038 042038 000018 00  WA  0   0  8           |      [14] hip_fatbin        PROGBITS        0000000000041780 042780 000030 00   A  0   0  8
  [21] .dynamic          DYNAMIC         0000000000244050 042050 0001f0 10  WA  7   0  8           |      [15] BinSegment        PROGBITS        00000000000417b0 0427b0 00007c 00   A  0   0  4
  [22] .got              PROGBITS        0000000000244240 042240 000010 00  WA  0   0  8           |      [16] _frame_hdr        PROGBITS        0000000000041830 042830 0001d4 00   A  0   0  8
  [23] .data             PROGBITS        0000000000245250 042250 000010 00  WA  0   0  8           |      [17]                   PROGBITS        0000000000000000 043000 000522 00  AX  0   0 16
  [24] .tm_clone_table   PROGBITS        0000000000245260 042260 000000 00  WA  0   0  8           |      [18] rame              PROGBITS        0000000000000524 043524 00001b 00  AX  0   0  4
  [25] .got.plt          PROGBITS        0000000000245260 042260 000078 00  WA  0   0  8           |      [19] text              PROGBITS        0000000000000540 043540 00000d 00  AX  0   0  4
  [26] .bss              NOBITS          00000000002452d8 0422d8 000018 00  WA  0   0  8           |      [20] init              PROGBITS        0000000000000550 043550 0000d0 00  AX  0   0 16
  [27] .comment          PROGBITS        0000000000000000 0422d8 00010b 01  MS  0   0  1           |      [21] .fini             FINI_ARRAY      0000000000000000 044000 000008 08  WA  0   0  8
  [28] .debug_loc        PROGBITS        0000000000000000 0423e3 0001a6 00      0   0  1           |      [22] fini_array        INIT_ARRAY      0000000000000008 044008 000018 00  WA  0   0  8
  [29] .debug_abbrev     PROGBITS        0000000000000000 042589 000960 00      0   0  1           |    readelf: Warning: [23]: Link field (7) should index a string section.
  [30] .debug_info       PROGBITS        0000000000000000 042ee9 00be2c 00      0   0  1           |      [23] init_array        DYNAMIC         0000000000000020 044020 0001f0 10  WA  7   0  8
  [31] .debug_str        PROGBITS        0000000000000000 04ed15 002394 01  MS  0   0  1           |      [24] y                 PROGBITS        0000000000000210 044210 000010 00  WA  0   0  8
  [32] .debug_line       PROGBITS        0000000000000000 0510a9 000e2e 00      0   0  1           |      [25] namic             PROGBITS        0000000000000000 045000 000010 00  WA  0   0  8
  [33] .symtab           SYMTAB          0000000000000000 051ed8 0005a0 18     35  33  8           |      [26] .got              PROGBITS        0000000000000010 045010 000000 00  WA  0   0  8
  [34] .shstrtab         STRTAB          0000000000000000 052478 00015f 00      0   0  1           |      [27] lone_table        PROGBITS        0000000000000010 045010 000078 00  WA  0   0  8
  [35] .strtab           STRTAB          0000000000000000 0525d7 0003c5 00      0   0  1           |      [28] e                 NOBITS          0000000000000088 045088 000000 00  WA  0   0  8
                                                                                                   >      [29] t.plt             PROGBITS        0000000000000000 0451f2 00010b 01  MS  0   0  1
                                                                                                   >      [30] s                 PROGBITS        0000000000000000 0452fd 0001a6 00      0   0  1
                                                                                                   >      [31] .debug_loc        PROGBITS        0000000000000000 0454a3 000960 00      0   0  1
                                                                                                   >      [32] bug_abbrev        PROGBITS        0000000000000000 045e03 00be2c 00      0   0  1
                                                                                                   >      [33] debug_info        PROGBITS        0000000000000000 051c2f 002394 01  MS  0   0  1
                                                                                                   >      [34] .debug_str        PROGBITS        0000000000000000 053fc3 000e2e 00      0   0  1
                                                                                                   >    readelf: Warning: [35]: Link field (35) should index a string section.
                                                                                                   >      [35] debug_line        SYMTAB          0000000000000000 054df8 0005a0 18     35  33  8
                                                                                                   >      [36] ne                STRTAB          0000000000000000 055398 00015f 00      0   0  1
                                                                                                   >      [37]                   STRTAB          0000000000000000 0554f7 0003c5 00      0   0  1
Key to Flags:                                                                                           Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),                                    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),                                   L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),                                              C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)                                                                       l (large), p (processor specific)

There are no section groups in this file.                                                               There are no section groups in this file.

Program Headers:                                                                                        Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align               Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x000040 0x0000000000200040 0x0000000000200040 0x000268 0x000268 R   0x8          |      PHDR           0x000040 0x0000000000000000 0x0000000000000000 0x000268 0x000268 R   0x8
  INTERP         0x0002a8 0x00000000002002a8 0x00000000002002a8 0x00001c 0x00001c R   0x1          |    readelf: Error: the PHDR segment is not covered by a LOAD segment
                                                                                                   >      INTERP         0x001000 0x0000000000000000 0x0000000000000000 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]                                           [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x000000 0x0000000000200000 0x0000000000200000 0x041a04 0x041a04 R   0x1000       |      LOAD           0x001000 0x0000000000000000 0x0000000000000000 0x041a04 0x041a04 R   0x1000
  LOAD           0x041a10 0x0000000000242a10 0x0000000000242a10 0x000620 0x000620 R E 0x1000       |      LOAD           0x043000 0x0000000000000000 0x0000000000000000 0x000620 0x000620 R E 0x1000
  LOAD           0x042030 0x0000000000244030 0x0000000000244030 0x000220 0x000220 RW  0x1000       |      LOAD           0x044000 0x0000000000000000 0x0000000000000000 0x000220 0x000220 RW  0x1000
  LOAD           0x042250 0x0000000000245250 0x0000000000245250 0x000088 0x0000a0 RW  0x1000       |      LOAD           0x045000 0x0000000000000000 0x0000000000000000 0x000088 0x000088 RW  0x1000
  DYNAMIC        0x042050 0x0000000000244050 0x0000000000244050 0x0001f0 0x0001f0 RW  0x8          |      DYNAMIC        0x044020 0x0000000000000000 0x0000000000000000 0x0001f0 0x0001f0 RW  0x8
  GNU_RELRO      0x042030 0x0000000000244030 0x0000000000244030 0x000220 0x000fd0 R   0x1          |    readelf: Error: no .dynamic section in the dynamic segment
  GNU_EH_FRAME   0x0417b0 0x00000000002417b0 0x00000000002417b0 0x00007c 0x00007c R   0x4          |      GNU_RELRO      0x044000 0x0000000000000000 0x0000000000000000 0x000220 0x000220 R   0x8
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0            |      GNU_EH_FRAME   0x0427b0 0x0000000000000000 0x0000000000000000 0x00007c 0x00007c R   0x4
  NOTE           0x0002c4 0x00000000002002c4 0x00000000002002c4 0x000020 0x000020 R   0x4          |      GNU_STACK      0x045088 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0
                                                                                                   >      NOTE           0x00101c 0x0000000000000000 0x0000000000000000 0x000020 0x000020 R   0x4

 Section to Segment mapping:                                                                             Section to Segment mapping:
  Segment Sections...                                                                                     Segment Sections...
   00                                                                                                      00     
   01     .interp                                                                                  |       01     .shstrtab 
   02     .interp .note.ABI-tag .dynsym .gnu.version .gnu.version_r .gnu.hash .dynstr .rela.dyn    |       02     .shstrtab b te.ABI-tag ag nu.version .version_r  sh   lt hip_fatbin BinSegment _frame_
   03     .text .init .fini .plt                                                                   |       03      rame text init e 
   04     .fini_array .init_array .dynamic .got                                                    |       04     .fini fini_array init_array y e 
   05     .data .tm_clone_table .got.plt .bss                                                      |       05     namic .got lone_table 
   06     .dynamic                                                                                 |       06     e 
   07     .fini_array .init_array .dynamic .got                                                    |       07     .fini fini_array init_array y e 
   08     .eh_frame_hdr                                                                            |       08     
   09                                                                                                      09     
   10     .note.ABI-tag                                                                            |       10     
                                                                                                   >    readelf: Warning: Virtual address 0x200504 not located in any PT_LOAD segment.
                                                                                                   >    readelf: Error: Unable to determine the length of the dynamic string table

Dynamic section at offset 0x42050 contains 31 entries:                                             |    Dynamic section at offset 0x44020 contains 31 entries:
  Tag        Type                         Name/Value                                                      Tag        Type                         Name/Value
 0x000000000000001d (RUNPATH)            Library runpath: [/opt/rocm/lib:/opt/rocm-4.3.0/hip/lib   |     0x000000000000001d (RUNPATH)            0x159
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]                           |     0x0000000000000001 (NEEDED)             0x193
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]                         |     0x0000000000000001 (NEEDED)             0x1a1
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]                               |     0x0000000000000001 (NEEDED)             0x1b1
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]                              |     0x0000000000000001 (NEEDED)             0x1bb
 0x0000000000000001 (NEEDED)             Shared library: [libamdhip64.so.4]                        |     0x0000000000000001 (NEEDED)             0x12a
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]                          |     0x0000000000000001 (NEEDED)             0x1c6
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]                               |     0x0000000000000001 (NEEDED)             0x143
 0x0000000000000015 (DEBUG)              0x0                                                             0x0000000000000015 (DEBUG)              0x0
 0x0000000000000007 (RELA)               0x2006e0                                                        0x0000000000000007 (RELA)               0x2006e0
 0x0000000000000008 (RELASZ)             48 (bytes)                                                      0x0000000000000008 (RELASZ)             48 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)                                                      0x0000000000000009 (RELAENT)            24 (bytes)
 0x0000000000000017 (JMPREL)             0x200710                                                        0x0000000000000017 (JMPREL)             0x200710
 0x0000000000000002 (PLTRELSZ)           288 (bytes)                                                     0x0000000000000002 (PLTRELSZ)           288 (bytes)
 0x0000000000000003 (PLTGOT)             0x245260                                                        0x0000000000000003 (PLTGOT)             0x245260
 0x0000000000000014 (PLTREL)             RELA                                                            0x0000000000000014 (PLTREL)             RELA
 0x0000000000000006 (SYMTAB)             0x2002e8                                                        0x0000000000000006 (SYMTAB)             0x2002e8
 0x000000000000000b (SYMENT)             24 (bytes)                                                      0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000005 (STRTAB)             0x200504                                                        0x0000000000000005 (STRTAB)             0x200504
 0x000000000000000a (STRSZ)              469 (bytes)                                                     0x000000000000000a (STRSZ)              469 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x2004e8                                                        0x000000006ffffef5 (GNU_HASH)           0x2004e8
 0x0000000000000019 (INIT_ARRAY)         0x244038                                                        0x0000000000000019 (INIT_ARRAY)         0x244038
 0x000000000000001b (INIT_ARRAYSZ)       24 (bytes)                                                      0x000000000000001b (INIT_ARRAYSZ)       24 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x244030                                                        0x000000000000001a (FINI_ARRAY)         0x244030
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)                                                       0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000000000000c (INIT)               0x242f34                                                        0x000000000000000c (INIT)               0x242f34
 0x000000000000000d (FINI)               0x242f50                                                        0x000000000000000d (FINI)               0x242f50
 0x000000006ffffff0 (VERSYM)             0x200480                                                        0x000000006ffffff0 (VERSYM)             0x200480
 0x000000006ffffffe (VERNEED)            0x2004a4                                                        0x000000006ffffffe (VERNEED)            0x2004a4
 0x000000006fffffff (VERNEEDNUM)         2                                                               0x000000006fffffff (VERNEEDNUM)         2
 0x0000000000000000 (NULL)               0x0                                                             0x0000000000000000 (NULL)               0x0

Relocation section '.rela.dyn' at offset 0x6e0 contains 2 entries:                                 |    Relocation section 'sh' at offset 0x1438 contains 2 entries:
    Offset             Info             Type               Symbol's Value  Symbol's Name + Adden   |
0000000000244240  0000000100000006 R_X86_64_GLOB_DAT      0000000000000000 __libc_start_main@GLI   |    Relocation section '' at offset 0x1468 contains 12 entries:
0000000000244248  0000000200000006 R_X86_64_GLOB_DAT      0000000000000000 __gmon_start__ + 0      |
                                                                                                   |    There are no static relocations in this file.
Relocation section '.rela.plt' at offset 0x710 contains 12 entries:                                |    To see the dynamic relocations add --use-dynamic to the command line.
    Offset             Info             Type               Symbol's Value  Symbol's Name + Adden   <
0000000000245278  0000000500000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipPopCallConfigura   <
0000000000245280  0000000600000007 R_X86_64_JUMP_SLOT     0000000000000000 hipLaunchKernel@hip_4   <
0000000000245288  0000000700000007 R_X86_64_JUMP_SLOT     0000000000000000 printf@GLIBC_2.2.5 +    <
0000000000245290  0000000800000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipPushCallConfigur   <
0000000000245298  0000000900000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMalloc@hip_4.2 + 0   <
00000000002452a0  0000000a00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMemset@hip_4.2 + 0   <
00000000002452a8  0000000b00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMemcpy@hip_4.2 + 0   <
00000000002452b0  0000000c00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipDeviceSynchronize@   <
00000000002452b8  0000000d00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipRegisterFatBinar   <
00000000002452c0  0000000e00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipRegisterFunction   <
00000000002452c8  0000000f00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipUnregisterFatBin   <
00000000002452d0  0000001000000007 R_X86_64_JUMP_SLOT     0000000000000000 __cxa_atexit@GLIBC_2.   <

The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently         The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently 
                                                                                                   >    readelf: Warning: Virtual address 0x2004e8 not located in any PT_LOAD segment.
                                                                                                   >    readelf: Error: Failed to read in number of buckets

Symbol table '.dynsym' contains 17 entries:                                                        |    Symbol table 'te.ABI-tag' contains 17 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name                                            Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND                                         |         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND ^Areadelf: Warning: Virtual address 0
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)       |    readelf: Error: Reading 2 bytes extends past end of file for version data
     2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__                          |
     3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable             |         1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND readelf: Warning: Virtual address 0x2
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable               |    readelf: Error: Reading 2 bytes extends past end of file for version data
     5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPopCallConfiguration@hip_4.2 (3)   |
     6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipLaunchKernel@hip_4.2 (3)             |         2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND readelf: Warning: Virtual address 0x2
     7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)                  |    readelf: Error: Reading 2 bytes extends past end of file for version data
     8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPushCallConfiguration@hip_4.2 (3   |
     9: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMalloc@hip_4.2 (3)                   |         3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND ^F^Oreadelf: Warning: Virtual address
    10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemset@hip_4.2 (3)                   |    readelf: Error: Reading 2 bytes extends past end of file for version data
    11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemcpy@hip_4.2 (3)                   |
    12: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipDeviceSynchronize@hip_4.2 (3)        |         4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND readelf: Warning: Virtual address 0x2
    13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFatBinary@hip_4.2 (3)      |    readelf: Error: Reading 2 bytes extends past end of file for version data
    14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFunction@hip_4.2 (3)       |
    15: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipUnregisterFatBinary@hip_4.2 (3)    |         5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
    16: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit@GLIBC_2.2.5 (2)            |    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >         6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >         7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >         8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >         9: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >        10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >        11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >        12: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >        13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >        14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >        15: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >
                                                                                                   >        16: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND <corrupt>readelf: Warning: Virtual ad
                                                                                                   >    readelf: Error: Reading 2 bytes extends past end of file for version data
                                                                                                   >

Symbol table '.symtab' contains 60 entries:                                                        |    Symbol table 'debug_line' contains 60 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name                                            Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND                                                   0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c                              |         1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
     2: 0000000000245260     0 OBJECT  LOCAL  DEFAULT   24 __TMC_LIST__                            |         2: 0000000000245260     0 OBJECT  LOCAL  DEFAULT   24 
     3: 0000000000242a50     0 FUNC    LOCAL  DEFAULT   15 deregister_tm_clones                    |         3: 0000000000242a50     0 FUNC    LOCAL  DEFAULT   15 
     4: 0000000000242a80     0 FUNC    LOCAL  DEFAULT   15 register_tm_clones                      |         4: 0000000000242a80     0 FUNC    LOCAL  DEFAULT   15 
     5: 0000000000242ac0     0 FUNC    LOCAL  DEFAULT   15 __do_global_dtors_aux                   |         5: 0000000000242ac0     0 FUNC    LOCAL  DEFAULT   15 
     6: 00000000002452d8     1 OBJECT  LOCAL  DEFAULT   26 completed.0                             |         6: 00000000002452d8     1 OBJECT  LOCAL  DEFAULT   26 
     7: 0000000000244030     0 OBJECT  LOCAL  DEFAULT   19 __do_global_dtors_aux_fini_array_entr   |         7: 0000000000244030     0 OBJECT  LOCAL  DEFAULT   19 
     8: 0000000000242af0     0 FUNC    LOCAL  DEFAULT   15 frame_dummy                             |         8: 0000000000242af0     0 FUNC    LOCAL  DEFAULT   15 
     9: 0000000000244038     0 OBJECT  LOCAL  DEFAULT   20 __frame_dummy_init_array_entry          |         9: 0000000000244038     0 OBJECT  LOCAL  DEFAULT   20 ^Z
    10: 0000000000245258     0 OBJECT  LOCAL  HIDDEN    23 __dso_handle                            |        10: 0000000000245258     0 OBJECT  LOCAL  HIDDEN    23 
    11: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS source2.hip                             |        11: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
    12: 0000000000242d20    91 FUNC    LOCAL  DEFAULT   15 __hip_module_ctor                       |        12: 0000000000242d20    91 FUNC    LOCAL  DEFAULT   15 
    13: 00000000002452e0     8 OBJECT  LOCAL  DEFAULT   26 __hip_gpubin_handle                     |        13: 00000000002452e0     8 OBJECT  LOCAL  DEFAULT   26 
    14: 0000000000241780    24 OBJECT  LOCAL  DEFAULT   12 __hip_fatbin_wrapper                    |        14: 0000000000241780    24 OBJECT  LOCAL  DEFAULT   12 
    15: 0000000000242d80    31 FUNC    LOCAL  DEFAULT   15 __hip_module_dtor                       |        15: 0000000000242d80    31 FUNC    LOCAL  DEFAULT   15 
    16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS source1.hip                             |        16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS ��
    17: 0000000000242e00    91 FUNC    LOCAL  DEFAULT   15 __hip_module_ctor                       |        17: 0000000000242e00    91 FUNC    LOCAL  DEFAULT   15 
    18: 00000000002452e8     8 OBJECT  LOCAL  DEFAULT   26 __hip_gpubin_handle                     |        18: 00000000002452e8     8 OBJECT  LOCAL  DEFAULT   26 
    19: 0000000000241798    24 OBJECT  LOCAL  DEFAULT   12 __hip_fatbin_wrapper                    |        19: 0000000000241798    24 OBJECT  LOCAL  DEFAULT   12 
    20: 0000000000242e60    31 FUNC    LOCAL  DEFAULT   15 __hip_module_dtor                       |        20: 0000000000242e60    31 FUNC    LOCAL  DEFAULT   15 
    21: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS inst.hip                                |        21: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
    22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c                              |        22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
    23: 0000000000241830     0 OBJECT  LOCAL  DEFAULT   14 __FRAME_END__                           |        23: 0000000000241830     0 OBJECT  LOCAL  DEFAULT   14 
    24: 0000000000245260     0 OBJECT  LOCAL  HIDDEN    24 __TMC_END__                             |        24: 0000000000245260     0 OBJECT  LOCAL  HIDDEN    24 
    25: 0000000000242a40     5 FUNC    LOCAL  HIDDEN    15 _dl_relocate_static_pie                 |        25: 0000000000242a40     5 FUNC    LOCAL  HIDDEN    15 R$
    26: 0000000000245260     0 NOTYPE  LOCAL  HIDDEN    25 _GLOBAL_OFFSET_TABLE_                   |        26: 0000000000245260     0 NOTYPE  LOCAL  HIDDEN    25 ^N^A
    27: 0000000000244038     0 NOTYPE  LOCAL  HIDDEN    20 __init_array_start                      |        27: 0000000000244038     0 NOTYPE  LOCAL  HIDDEN    20 0^H 
    28: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    20 __init_array_end                        |        28: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    20 
    29: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    21 _DYNAMIC                                |        29: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    21 
    30: 0000000000242f34     0 FUNC    LOCAL  HIDDEN    16 _init                                   |        30: 0000000000242f34     0 FUNC    LOCAL  HIDDEN    16 
    31: 0000000000242f50     0 FUNC    LOCAL  HIDDEN    17 _fini                                   |        31: 0000000000242f50     0 FUNC    LOCAL  HIDDEN    17 
    32: 0000000000242f20    18 FUNC    LOCAL  HIDDEN    15 atexit                                  |        32: 0000000000242f20    18 FUNC    LOCAL  HIDDEN    15 
    33: 0000000000242f10     5 FUNC    GLOBAL DEFAULT   15 __libc_csu_fini                         |        33: 0000000000242f10     5 FUNC    GLOBAL DEFAULT   15 
    34: 0000000000242a10    47 FUNC    GLOBAL DEFAULT   15 _start                                  |        34: 0000000000242a10    47 FUNC    GLOBAL DEFAULT   15 ^W$
    35: 0000000000242ea0   101 FUNC    GLOBAL DEFAULT   15 __libc_csu_init                         |        35: 0000000000242ea0   101 FUNC    GLOBAL DEFAULT   15 ^X
    36: 0000000000242b60   434 FUNC    GLOBAL DEFAULT   15 main                                    |        36: 0000000000242b60   434 FUNC    GLOBAL DEFAULT   15 �-$
    37: 0000000000245250     0 NOTYPE  WEAK   DEFAULT   23 data_start                              |        37: 0000000000245250     0 NOTYPE  WEAK   DEFAULT   23 
    38: 0000000000200830     4 OBJECT  GLOBAL DEFAULT   10 _IO_stdin_used                          |        38: 0000000000200830     4 OBJECT  GLOBAL DEFAULT   10 
    39: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main                       |        39: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    40: 0000000000245250     0 NOTYPE  GLOBAL DEFAULT   23 __data_start                            |        40: 0000000000245250     0 NOTYPE  GLOBAL DEFAULT   23 
    41: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__                          |        41: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND 
    42: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable             |        42: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND 
    43: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable               |        43: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND 
    44: 0000000000242b00    90 FUNC    GLOBAL DEFAULT   15 _Z22__device_stub__source2i             |        44: 0000000000242b00    90 FUNC    GLOBAL DEFAULT   15 ^N
    45: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPopCallConfiguration               |        45: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND $
    46: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipLaunchKernel                         |        46: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    47: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf                                  |        47: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    48: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPushCallConfiguration              |        48: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMalloc                               |        49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    50: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemset                               |        50: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND �^C
    51: 0000000000242da0    88 FUNC    GLOBAL DEFAULT   15 _Z22__device_stub__source1Pi            |        51: 0000000000242da0    88 FUNC    GLOBAL DEFAULT   15 $
    52: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemcpy                               |        52: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipDeviceSynchronize                    |        53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND ^A
    54: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFatBinary                  |        54: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    55: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFunction                   |        55: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    56: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipUnregisterFatBinary                |        56: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
    57: 0000000000242e80     1 FUNC    GLOBAL DEFAULT   15 _ZN11device_data8allocateEmP12ihipStr   |        57: 0000000000242e80     1 FUNC    GLOBAL DEFAULT   15 
    58: 0000000000242e90     1 FUNC    GLOBAL DEFAULT   15 _ZN11device_data10deallocateEP12ihipS   |        58: 0000000000242e90     1 FUNC    GLOBAL DEFAULT   15 
    59: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit                            |        59: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND 
                                                                                                   |    readelf: Error: Section .shstrtab has an invalid sh_entsize of 0x0
Version symbols section '.gnu.version' contains 17 entries:                                        |
 Addr: 0x0000000000200480  Offset: 0x000480  Link: 3 (.dynsym)                                     |    Version needs section 'nu.version' contains 2 entries:
  000:   0 (*local*)       2 (GLIBC_2.2.5)   1 (*global*)      1 (*global*)                        |     Addr: 0x00000000000001fc  Offset: 0x0011fc  Link: 7 (nu.version)
  004:   1 (*global*)      3 (hip_4.2)       3 (hip_4.2)       2 (GLIBC_2.2.5)                     |      000000: Version: 1  File: 12a  Cnt: 1
  008:   3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)                         |      0x0020:   Name index: 13b  Flags: none  Version: 3
  00c:   3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)                         |      0x0010: Version: 1  File: 143  Cnt: 1
  010:   2 (GLIBC_2.2.5)                                                                           |      0x0030:   Name index: 14d  Flags: none  Version: 2
                                                                                                   <
Version needs section '.gnu.version_r' contains 2 entries:                                         <
 Addr: 0x00000000002004a4  Offset: 0x0004a4  Link: 7 (.dynstr)                                     <
  000000: Version: 1  File: libamdhip64.so.4  Cnt: 1                                               <
  0x0020:   Name: hip_4.2  Flags: none  Version: 3                                                 <
  0x0010: Version: 1  File: libc.so.6  Cnt: 1                                                      <
  0x0030:   Name: GLIBC_2.2.5  Flags: none  Version: 2                                             <

Displaying notes found in: .note.ABI-tag                                                           |    Displaying notes found in: b
  Owner                Data size        Description                                                       Owner                Data size        Description
  GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)            OS: Linux, A          GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)            OS: Linux, A

I've read the docs pretty thoroughly and looked at several of the examples and tests and it doesn't appear to me that there is any significant part of the API that I am ignoring when copying things over to the writer (there are a few minor things like the segment file/memory size but nearly everything I excluded was bc they were causing validation or write errors at some point).

Hi @jrmadsen ,
A simpler way to copy ELF file would be:

    ELFIO::elfio reader;
    reader.load(in);
    reader.save(out);

@serge1 yes, that possibility was not lost on me. The objective of this exercise was to validate that I could assemble a valid ELF file from the components, not just copy it. In practice, I am going to be interacting with a compiler API and will need to essentially do something along the lines of the highly simplified model I provided here

By the way, I'm happy to fix this issue myself. Not expecting you to, just looking for insight or at least guesses about what is going wrong.

I am going to look at the differencies. The first think coming is that creating a new instance of 'elfio' automatically creates a couple of required sections. Those sections are duplicated again when the full list of sections is copied.

The second aspect I would look at is the segments memory layout. When elfio creates a segment layout, it obeys the visible section align rules. It might be different from the memory layout used by the original file. In the last case, all reallocations will be shifted. This will lead to an incorrect output file image.

Please also look at https://github.com/serge1/ELFIO/wiki/How-to-modify-section-data

As for the pair 'load+save', the library makes special effort trying to remember original offsets. It is not 100% solution too, but, it works in some basic cases.

If you are going to work with a compiler API, most likely, you will work with not linked object files. In such case, the things become much easy.

Those segments are duplicated again when the full list of sections is copied.

Due to automatically inserted sections, all the 'link' fields from the original file are become invalid. In particular, this leads to incorrect relocations during loading process.

Yet another advice - you may check equivalence of two ELF files by using functions similar to checkObjestsAreEqual() and checkExeAreEqual() located in tests/ELFIOTest1.cpp.

Let me know if you have further doubts

Those segments are duplicated again when the full list of sections is copied.

Due to automatically inserted sections, all the 'link' fields from the original file are become invalid. In particular, this leads to incorrect relocations during loading process.

Similarly, due to a different order of sections insertion, section header string table cannot be reused "as is". All string pointers become invalid.

NULL section should not be copied again

@serge1 Thank you for all your insight. I had to make segment::set_offset public to finally get it working. Here is the final simplified workflow:

using Section = ELFIO::section;
using Segment = ELFIO::segment;

void read_write(std::string in, std::string out)
{
    ELFIO::elfio reader{};
    ELFIO::elfio writer{};

    reader.load(in);

    writer.create(reader.get_class(), reader.get_encoding());
    writer.set_os_abi(reader.get_os_abi());
    writer.set_type(reader.get_type());
    writer.set_machine(reader.get_machine());
    writer.set_abi_version(reader.get_abi_version());
    writer.set_entry(reader.get_entry());

    std::vector<std::pair<Section*, Section*>> _sections{};
    std::vector<std::pair<Segment*, Segment*>> _segments{};
    std::map<ELFIO::Elf_Word, ELFIO::Elf_Word> _section_index_mapping = { { 0, 0 } };

    for(size_t i = 0; i < reader.sections.size(); ++i)
    {
        Section* _read = reader.sections[i];
        if(_read->get_name().empty())
            continue;
        auto itr = std::find_if(
            writer.sections.begin(), writer.sections.end(),
            [_read](const Section* _v) { return _v->get_name() == _read->get_name(); });
        _sections.emplace_back(_read, (itr == writer.sections.end())
                                          ? writer.sections.add(_read->get_name())
                                          : *itr);
    }

    for(size_t i = 0; i < reader.segments.size(); ++i)
        _segments.emplace_back(reader.segments[i], writer.segments.add());

    for(auto& itr : _sections)
        _section_index_mapping.emplace(itr.first->get_index(), itr.second->get_index());

    for(auto& itr : _sections)
    {
        auto* _read  = itr.first;
        auto* _write = itr.second;

        _write->set_name(_read->get_name());
        _write->set_type(_read->get_type());
        _write->set_flags(_read->get_flags());
        _write->set_address(_read->get_address());
        _write->set_addr_align(_read->get_addr_align());
        _write->set_link(_section_index_mapping.at(_read->get_link()));
        _write->set_info(_read->get_info());
        _write->set_name_string_offset(_read->get_name_string_offset());
        _write->set_entry_size(_read->get_entry_size());
        if(_write->get_name() != ".bss")
            _write->set_data(_read->get_data(), _read->get_size());
        else
            _write->set_size(24);
    }

    for(auto& itr : _segments)
    {
        auto* _read  = itr.first;
        auto* _write = itr.second;

        _write->set_type(_read->get_type());
        _write->set_flags(_read->get_flags());
        _write->set_align(_read->get_align());
        _write->set_virtual_address(_read->get_virtual_address());
        _write->set_physical_address(_read->get_physical_address());
        _write->set_offset(_read->get_offset());
        for(size_t i = 0; i < _read->get_sections_num(); ++i)
        {
            Section* _read_sec = reader.sections[_read->get_section_index_at(i)];
            Section* _write_sec =
                writer.sections[_section_index_mapping.at(_read_sec->get_index())];
            _write->add_section(_write_sec, _write_sec->get_addr_align());
        }
    }

    writer.save(out);
}

And the diff:

$ readelf -a -W ./exe &> dump.exe && readelf -a -W ./exe.mod &> dump.exe.mod && diff -y -W 200 ./dump.exe ./dump.exe.mod
ELF Header:                                                                                             ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00                                                Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64                                                                Class:                             ELF64
  Data:                              2's complement, little endian                                        Data:                              2's complement, little endian
  Version:                           1 (current)                                                          Version:                           1 (current)
  OS/ABI:                            UNIX - System V                                                      OS/ABI:                            UNIX - System V
  ABI Version:                       0                                                                    ABI Version:                       0
  Type:                              EXEC (Executable file)                                               Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64                                        Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1                                                                  Version:                           0x1
  Entry point address:               0x242a10                                                             Entry point address:               0x242a10
  Start of program headers:          64 (bytes into file)                                                 Start of program headers:          64 (bytes into file)
  Start of section headers:          338336 (bytes into file)                                             Start of section headers:          338336 (bytes into file)
  Flags:                             0x0                                                                  Flags:                             0x0
  Size of this header:               64 (bytes)                                                           Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)                                                           Size of program headers:           56 (bytes)
  Number of program headers:         11                                                                   Number of program headers:         11
  Size of section headers:           64 (bytes)                                                           Size of section headers:           64 (bytes)
  Number of section headers:         36                                                                   Number of section headers:         36
  Section header string table index: 34                                                            |      Section header string table index: 1

Section Headers:                                                                                        Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al                  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0                  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        00000000002002a8 0002a8 00001c 00   A  0   0  1           |      [ 1] .shstrtab         STRTAB          0000000000000000 0422d8 00015f 00      0   0  1
  [ 2] .note.ABI-tag     NOTE            00000000002002c4 0002c4 000020 00   A  0   0  4           |      [ 2] .interp           PROGBITS        00000000002002a8 0002a8 00001c 00   A  0   0  1
  [ 3] .dynsym           DYNSYM          00000000002002e8 0002e8 000198 18   A  7   1  8           |      [ 3] .note.ABI-tag     NOTE            00000000002002c4 0002c4 000020 00   A  0   0  4
  [ 4] .gnu.version      VERSYM          0000000000200480 000480 000022 02   A  3   0  2           |      [ 4] .dynsym           DYNSYM          00000000002002e8 0002e8 000198 18   A  8   1  8
  [ 5] .gnu.version_r    VERNEED         00000000002004a4 0004a4 000040 00   A  7   2  4           |      [ 5] .gnu.version      VERSYM          0000000000200480 000480 000022 02   A  4   0  2
  [ 6] .gnu.hash         GNU_HASH        00000000002004e8 0004e8 00001c 00   A  3   0  8           |      [ 6] .gnu.version_r    VERNEED         00000000002004a4 0004a4 000040 00   A  8   2  4
  [ 7] .dynstr           STRTAB          0000000000200504 000504 0001d5 00   A  0   0  1           |      [ 7] .gnu.hash         GNU_HASH        00000000002004e8 0004e8 00001c 00   A  4   0  8
  [ 8] .rela.dyn         RELA            00000000002006e0 0006e0 000030 18   A  3   0  8           |      [ 8] .dynstr           STRTAB          0000000000200504 000504 0001d5 00   A  0   0  1
  [ 9] .rela.plt         RELA            0000000000200710 000710 000120 18  AI  3  25  8           |      [ 9] .rela.dyn         RELA            00000000002006e0 0006e0 000030 18   A  4   0  8
  [10] .rodata           PROGBITS        0000000000200830 000830 000049 00 AMS  0   0  4           |      [10] .rela.plt         RELA            0000000000200710 000710 000120 18  AI  4  25  8
  [11] .hip_fatbin       PROGBITS        0000000000201000 001000 040779 00   A  0   0 4096         |      [11] .rodata           PROGBITS        0000000000200830 000830 000049 00 AMS  0   0  4
  [12] .hipFatBinSegment PROGBITS        0000000000241780 041780 000030 00   A  0   0  8           |      [12] .hip_fatbin       PROGBITS        0000000000201000 001000 040779 00   A  0   0 4096
  [13] .eh_frame_hdr     PROGBITS        00000000002417b0 0417b0 00007c 00   A  0   0  4           |      [13] .hipFatBinSegment PROGBITS        0000000000241780 041780 000030 00   A  0   0  8
  [14] .eh_frame         PROGBITS        0000000000241830 041830 0001d4 00   A  0   0  8           |      [14] .eh_frame_hdr     PROGBITS        00000000002417b0 0417b0 00007c 00   A  0   0  4
  [15] .text             PROGBITS        0000000000242a10 041a10 000522 00  AX  0   0 16           |      [15] .eh_frame         PROGBITS        0000000000241830 041830 0001d4 00   A  0   0  8
  [16] .init             PROGBITS        0000000000242f34 041f34 00001b 00  AX  0   0  4           |      [16] .text             PROGBITS        0000000000242a10 041a10 000522 00  AX  0   0 16
  [17] .fini             PROGBITS        0000000000242f50 041f50 00000d 00  AX  0   0  4           |      [17] .init             PROGBITS        0000000000242f34 041f34 00001b 00  AX  0   0  4
  [18] .plt              PROGBITS        0000000000242f60 041f60 0000d0 00  AX  0   0 16           |      [18] .fini             PROGBITS        0000000000242f50 041f50 00000d 00  AX  0   0  4
  [19] .fini_array       FINI_ARRAY      0000000000244030 042030 000008 08  WA  0   0  8           |      [19] .plt              PROGBITS        0000000000242f60 041f60 0000d0 00  AX  0   0 16
  [20] .init_array       INIT_ARRAY      0000000000244038 042038 000018 00  WA  0   0  8           |      [20] .fini_array       FINI_ARRAY      0000000000244030 042030 000008 08  WA  0   0  8
  [21] .dynamic          DYNAMIC         0000000000244050 042050 0001f0 10  WA  7   0  8           |      [21] .init_array       INIT_ARRAY      0000000000244038 042038 000018 00  WA  0   0  8
  [22] .got              PROGBITS        0000000000244240 042240 000010 00  WA  0   0  8           |      [22] .dynamic          DYNAMIC         0000000000244050 042050 0001f0 10  WA  8   0  8
  [23] .data             PROGBITS        0000000000245250 042250 000010 00  WA  0   0  8           |      [23] .got              PROGBITS        0000000000244240 042240 000010 00  WA  0   0  8
  [24] .tm_clone_table   PROGBITS        0000000000245260 042260 000000 00  WA  0   0  8           |      [24] .data             PROGBITS        0000000000245250 042250 000010 00  WA  0   0  8
  [25] .got.plt          PROGBITS        0000000000245260 042260 000078 00  WA  0   0  8           |      [25] .tm_clone_table   PROGBITS        0000000000245260 042260 000000 00  WA  0   0  8
  [26] .bss              NOBITS          00000000002452d8 0422d8 000018 00  WA  0   0  8           |      [26] .got.plt          PROGBITS        0000000000245260 042260 000078 00  WA  0   0  8
  [27] .comment          PROGBITS        0000000000000000 0422d8 00010b 01  MS  0   0  1           |      [27] .bss              NOBITS          00000000002452d8 0422d8 000018 00  WA  0   0  8
  [28] .debug_loc        PROGBITS        0000000000000000 0423e3 0001a6 00      0   0  1           |      [28] .comment          PROGBITS        0000000000000000 042437 00010b 01  MS  0   0  1
  [29] .debug_abbrev     PROGBITS        0000000000000000 042589 000960 00      0   0  1           |      [29] .debug_loc        PROGBITS        0000000000000000 042542 0001a6 00      0   0  1
  [30] .debug_info       PROGBITS        0000000000000000 042ee9 00be2c 00      0   0  1           |      [30] .debug_abbrev     PROGBITS        0000000000000000 0426e8 000960 00      0   0  1
  [31] .debug_str        PROGBITS        0000000000000000 04ed15 002394 01  MS  0   0  1           |      [31] .debug_info       PROGBITS        0000000000000000 043048 00be2c 00      0   0  1
  [32] .debug_line       PROGBITS        0000000000000000 0510a9 000e2e 00      0   0  1           |      [32] .debug_str        PROGBITS        0000000000000000 04ee74 002394 01  MS  0   0  1
  [33] .symtab           SYMTAB          0000000000000000 051ed8 0005a0 18     35  33  8           |      [33] .debug_line       PROGBITS        0000000000000000 051208 000e2e 00      0   0  1
  [34] .shstrtab         STRTAB          0000000000000000 052478 00015f 00      0   0  1           |      [34] .symtab           SYMTAB          0000000000000000 052038 0005a0 18     35  33  8
  [35] .strtab           STRTAB          0000000000000000 0525d7 0003c5 00      0   0  1           |      [35] .strtab           STRTAB          0000000000000000 0525d8 0003c5 00      0   0  1
Key to Flags:                                                                                           Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),                                    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),                                   L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),                                              C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)                                                                       l (large), p (processor specific)

There are no section groups in this file.                                                               There are no section groups in this file.

Program Headers:                                                                                        Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align               Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x000040 0x0000000000200040 0x0000000000200040 0x000268 0x000268 R   0x8                 PHDR           0x000040 0x0000000000200040 0x0000000000200040 0x000268 0x000268 R   0x8
  INTERP         0x0002a8 0x00000000002002a8 0x00000000002002a8 0x00001c 0x00001c R   0x1                 INTERP         0x0002a8 0x00000000002002a8 0x00000000002002a8 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]                                           [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x000000 0x0000000000200000 0x0000000000200000 0x041a04 0x041a04 R   0x1000              LOAD           0x000000 0x0000000000200000 0x0000000000200000 0x041a04 0x041a04 R   0x1000
  LOAD           0x041a10 0x0000000000242a10 0x0000000000242a10 0x000620 0x000620 R E 0x1000              LOAD           0x041a10 0x0000000000242a10 0x0000000000242a10 0x000620 0x000620 R E 0x1000
  LOAD           0x042030 0x0000000000244030 0x0000000000244030 0x000220 0x000220 RW  0x1000              LOAD           0x042030 0x0000000000244030 0x0000000000244030 0x000220 0x000220 RW  0x1000
  LOAD           0x042250 0x0000000000245250 0x0000000000245250 0x000088 0x0000a0 RW  0x1000              LOAD           0x042250 0x0000000000245250 0x0000000000245250 0x000088 0x0000a0 RW  0x1000
  DYNAMIC        0x042050 0x0000000000244050 0x0000000000244050 0x0001f0 0x0001f0 RW  0x8                 DYNAMIC        0x042050 0x0000000000244050 0x0000000000244050 0x0001f0 0x0001f0 RW  0x8
  GNU_RELRO      0x042030 0x0000000000244030 0x0000000000244030 0x000220 0x000fd0 R   0x1          |      GNU_RELRO      0x042030 0x0000000000244030 0x0000000000244030 0x000220 0x000220 R   0x8
  GNU_EH_FRAME   0x0417b0 0x00000000002417b0 0x00000000002417b0 0x00007c 0x00007c R   0x4                 GNU_EH_FRAME   0x0417b0 0x00000000002417b0 0x00000000002417b0 0x00007c 0x00007c R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0                   GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0
  NOTE           0x0002c4 0x00000000002002c4 0x00000000002002c4 0x000020 0x000020 R   0x4                 NOTE           0x0002c4 0x00000000002002c4 0x00000000002002c4 0x000020 0x000020 R   0x4

 Section to Segment mapping:                                                                             Section to Segment mapping:
  Segment Sections...                                                                                     Segment Sections...
   00                                                                                                      00     
   01     .interp                                                                                          01     .interp 
   02     .interp .note.ABI-tag .dynsym .gnu.version .gnu.version_r .gnu.hash .dynstr .rela.dyn            02     .interp .note.ABI-tag .dynsym .gnu.version .gnu.version_r .gnu.hash .dynstr .rela.dyn 
   03     .text .init .fini .plt                                                                           03     .text .init .fini .plt 
   04     .fini_array .init_array .dynamic .got                                                            04     .fini_array .init_array .dynamic .got 
   05     .data .tm_clone_table .got.plt .bss                                                              05     .data .tm_clone_table .got.plt .bss 
   06     .dynamic                                                                                         06     .dynamic 
   07     .fini_array .init_array .dynamic .got                                                            07     .fini_array .init_array .dynamic .got 
   08     .eh_frame_hdr                                                                                    08     .eh_frame_hdr 
   09                                                                                                      09     
   10     .note.ABI-tag                                                                                    10     .note.ABI-tag 

Dynamic section at offset 0x42050 contains 31 entries:                                                  Dynamic section at offset 0x42050 contains 31 entries:
  Tag        Type                         Name/Value                                                      Tag        Type                         Name/Value
 0x000000000000001d (RUNPATH)            Library runpath: [/opt/rocm/lib:/opt/rocm-4.3.0/hip/lib         0x000000000000001d (RUNPATH)            Library runpath: [/opt/rocm/lib:/opt/rocm-4.3.0/hip/lib
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]                                 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]                               0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]                                     0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]                                    0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libamdhip64.so.4]                              0x0000000000000001 (NEEDED)             Shared library: [libamdhip64.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]                                0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]                                     0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000015 (DEBUG)              0x0                                                             0x0000000000000015 (DEBUG)              0x0
 0x0000000000000007 (RELA)               0x2006e0                                                        0x0000000000000007 (RELA)               0x2006e0
 0x0000000000000008 (RELASZ)             48 (bytes)                                                      0x0000000000000008 (RELASZ)             48 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)                                                      0x0000000000000009 (RELAENT)            24 (bytes)
 0x0000000000000017 (JMPREL)             0x200710                                                        0x0000000000000017 (JMPREL)             0x200710
 0x0000000000000002 (PLTRELSZ)           288 (bytes)                                                     0x0000000000000002 (PLTRELSZ)           288 (bytes)
 0x0000000000000003 (PLTGOT)             0x245260                                                        0x0000000000000003 (PLTGOT)             0x245260
 0x0000000000000014 (PLTREL)             RELA                                                            0x0000000000000014 (PLTREL)             RELA
 0x0000000000000006 (SYMTAB)             0x2002e8                                                        0x0000000000000006 (SYMTAB)             0x2002e8
 0x000000000000000b (SYMENT)             24 (bytes)                                                      0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000005 (STRTAB)             0x200504                                                        0x0000000000000005 (STRTAB)             0x200504
 0x000000000000000a (STRSZ)              469 (bytes)                                                     0x000000000000000a (STRSZ)              469 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x2004e8                                                        0x000000006ffffef5 (GNU_HASH)           0x2004e8
 0x0000000000000019 (INIT_ARRAY)         0x244038                                                        0x0000000000000019 (INIT_ARRAY)         0x244038
 0x000000000000001b (INIT_ARRAYSZ)       24 (bytes)                                                      0x000000000000001b (INIT_ARRAYSZ)       24 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x244030                                                        0x000000000000001a (FINI_ARRAY)         0x244030
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)                                                       0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000000000000c (INIT)               0x242f34                                                        0x000000000000000c (INIT)               0x242f34
 0x000000000000000d (FINI)               0x242f50                                                        0x000000000000000d (FINI)               0x242f50
 0x000000006ffffff0 (VERSYM)             0x200480                                                        0x000000006ffffff0 (VERSYM)             0x200480
 0x000000006ffffffe (VERNEED)            0x2004a4                                                        0x000000006ffffffe (VERNEED)            0x2004a4
 0x000000006fffffff (VERNEEDNUM)         2                                                               0x000000006fffffff (VERNEEDNUM)         2
 0x0000000000000000 (NULL)               0x0                                                             0x0000000000000000 (NULL)               0x0

Relocation section '.rela.dyn' at offset 0x6e0 contains 2 entries:                                      Relocation section '.rela.dyn' at offset 0x6e0 contains 2 entries:
    Offset             Info             Type               Symbol's Value  Symbol's Name + Adden            Offset             Info             Type               Symbol's Value  Symbol's Name + Adden
0000000000244240  0000000100000006 R_X86_64_GLOB_DAT      0000000000000000 __libc_start_main@GLI        0000000000244240  0000000100000006 R_X86_64_GLOB_DAT      0000000000000000 __libc_start_main@GLI
0000000000244248  0000000200000006 R_X86_64_GLOB_DAT      0000000000000000 __gmon_start__ + 0           0000000000244248  0000000200000006 R_X86_64_GLOB_DAT      0000000000000000 __gmon_start__ + 0

Relocation section '.rela.plt' at offset 0x710 contains 12 entries:                                     Relocation section '.rela.plt' at offset 0x710 contains 12 entries:
    Offset             Info             Type               Symbol's Value  Symbol's Name + Adden            Offset             Info             Type               Symbol's Value  Symbol's Name + Adden
0000000000245278  0000000500000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipPopCallConfigura        0000000000245278  0000000500000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipPopCallConfigura
0000000000245280  0000000600000007 R_X86_64_JUMP_SLOT     0000000000000000 hipLaunchKernel@hip_4        0000000000245280  0000000600000007 R_X86_64_JUMP_SLOT     0000000000000000 hipLaunchKernel@hip_4
0000000000245288  0000000700000007 R_X86_64_JUMP_SLOT     0000000000000000 printf@GLIBC_2.2.5 +         0000000000245288  0000000700000007 R_X86_64_JUMP_SLOT     0000000000000000 printf@GLIBC_2.2.5 + 
0000000000245290  0000000800000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipPushCallConfigur        0000000000245290  0000000800000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipPushCallConfigur
0000000000245298  0000000900000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMalloc@hip_4.2 + 0        0000000000245298  0000000900000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMalloc@hip_4.2 + 0
00000000002452a0  0000000a00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMemset@hip_4.2 + 0        00000000002452a0  0000000a00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMemset@hip_4.2 + 0
00000000002452a8  0000000b00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMemcpy@hip_4.2 + 0        00000000002452a8  0000000b00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipMemcpy@hip_4.2 + 0
00000000002452b0  0000000c00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipDeviceSynchronize@        00000000002452b0  0000000c00000007 R_X86_64_JUMP_SLOT     0000000000000000 hipDeviceSynchronize@
00000000002452b8  0000000d00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipRegisterFatBinar        00000000002452b8  0000000d00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipRegisterFatBinar
00000000002452c0  0000000e00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipRegisterFunction        00000000002452c0  0000000e00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipRegisterFunction
00000000002452c8  0000000f00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipUnregisterFatBin        00000000002452c8  0000000f00000007 R_X86_64_JUMP_SLOT     0000000000000000 __hipUnregisterFatBin
00000000002452d0  0000001000000007 R_X86_64_JUMP_SLOT     0000000000000000 __cxa_atexit@GLIBC_2.        00000000002452d0  0000001000000007 R_X86_64_JUMP_SLOT     0000000000000000 __cxa_atexit@GLIBC_2.

The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently         The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently 

Symbol table '.dynsym' contains 17 entries:                                                             Symbol table '.dynsym' contains 17 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name                                            Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND                                                   0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)                 1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
     2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__                                    2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable                       3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable                         4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
     5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPopCallConfiguration@hip_4.2 (3)             5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPopCallConfiguration@hip_4.2 (3)
     6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipLaunchKernel@hip_4.2 (3)                       6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipLaunchKernel@hip_4.2 (3)
     7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)                            7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)
     8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPushCallConfiguration@hip_4.2 (3             8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPushCallConfiguration@hip_4.2 (3
     9: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMalloc@hip_4.2 (3)                             9: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMalloc@hip_4.2 (3)
    10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemset@hip_4.2 (3)                            10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemset@hip_4.2 (3)
    11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemcpy@hip_4.2 (3)                            11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemcpy@hip_4.2 (3)
    12: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipDeviceSynchronize@hip_4.2 (3)                 12: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipDeviceSynchronize@hip_4.2 (3)
    13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFatBinary@hip_4.2 (3)               13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFatBinary@hip_4.2 (3)
    14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFunction@hip_4.2 (3)                14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFunction@hip_4.2 (3)
    15: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipUnregisterFatBinary@hip_4.2 (3)             15: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipUnregisterFatBinary@hip_4.2 (3)
    16: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit@GLIBC_2.2.5 (2)                     16: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit@GLIBC_2.2.5 (2)

Symbol table '.symtab' contains 60 entries:                                                             Symbol table '.symtab' contains 60 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name                                            Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND                                                   0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c                                        1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
     2: 0000000000245260     0 OBJECT  LOCAL  DEFAULT   24 __TMC_LIST__                                      2: 0000000000245260     0 OBJECT  LOCAL  DEFAULT   24 __TMC_LIST__
     3: 0000000000242a50     0 FUNC    LOCAL  DEFAULT   15 deregister_tm_clones                              3: 0000000000242a50     0 FUNC    LOCAL  DEFAULT   15 deregister_tm_clones
     4: 0000000000242a80     0 FUNC    LOCAL  DEFAULT   15 register_tm_clones                                4: 0000000000242a80     0 FUNC    LOCAL  DEFAULT   15 register_tm_clones
     5: 0000000000242ac0     0 FUNC    LOCAL  DEFAULT   15 __do_global_dtors_aux                             5: 0000000000242ac0     0 FUNC    LOCAL  DEFAULT   15 __do_global_dtors_aux
     6: 00000000002452d8     1 OBJECT  LOCAL  DEFAULT   26 completed.0                                       6: 00000000002452d8     1 OBJECT  LOCAL  DEFAULT   26 completed.0
     7: 0000000000244030     0 OBJECT  LOCAL  DEFAULT   19 __do_global_dtors_aux_fini_array_entr             7: 0000000000244030     0 OBJECT  LOCAL  DEFAULT   19 __do_global_dtors_aux_fini_array_entr
     8: 0000000000242af0     0 FUNC    LOCAL  DEFAULT   15 frame_dummy                                       8: 0000000000242af0     0 FUNC    LOCAL  DEFAULT   15 frame_dummy
     9: 0000000000244038     0 OBJECT  LOCAL  DEFAULT   20 __frame_dummy_init_array_entry                    9: 0000000000244038     0 OBJECT  LOCAL  DEFAULT   20 __frame_dummy_init_array_entry
    10: 0000000000245258     0 OBJECT  LOCAL  HIDDEN    23 __dso_handle                                     10: 0000000000245258     0 OBJECT  LOCAL  HIDDEN    23 __dso_handle
    11: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS source2.hip                                      11: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS source2.hip
    12: 0000000000242d20    91 FUNC    LOCAL  DEFAULT   15 __hip_module_ctor                                12: 0000000000242d20    91 FUNC    LOCAL  DEFAULT   15 __hip_module_ctor
    13: 00000000002452e0     8 OBJECT  LOCAL  DEFAULT   26 __hip_gpubin_handle                              13: 00000000002452e0     8 OBJECT  LOCAL  DEFAULT   26 __hip_gpubin_handle
    14: 0000000000241780    24 OBJECT  LOCAL  DEFAULT   12 __hip_fatbin_wrapper                             14: 0000000000241780    24 OBJECT  LOCAL  DEFAULT   12 __hip_fatbin_wrapper
    15: 0000000000242d80    31 FUNC    LOCAL  DEFAULT   15 __hip_module_dtor                                15: 0000000000242d80    31 FUNC    LOCAL  DEFAULT   15 __hip_module_dtor
    16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS source1.hip                                      16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS source1.hip
    17: 0000000000242e00    91 FUNC    LOCAL  DEFAULT   15 __hip_module_ctor                                17: 0000000000242e00    91 FUNC    LOCAL  DEFAULT   15 __hip_module_ctor
    18: 00000000002452e8     8 OBJECT  LOCAL  DEFAULT   26 __hip_gpubin_handle                              18: 00000000002452e8     8 OBJECT  LOCAL  DEFAULT   26 __hip_gpubin_handle
    19: 0000000000241798    24 OBJECT  LOCAL  DEFAULT   12 __hip_fatbin_wrapper                             19: 0000000000241798    24 OBJECT  LOCAL  DEFAULT   12 __hip_fatbin_wrapper
    20: 0000000000242e60    31 FUNC    LOCAL  DEFAULT   15 __hip_module_dtor                                20: 0000000000242e60    31 FUNC    LOCAL  DEFAULT   15 __hip_module_dtor
    21: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS inst.hip                                         21: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS inst.hip
    22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c                                       22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    23: 0000000000241830     0 OBJECT  LOCAL  DEFAULT   14 __FRAME_END__                                    23: 0000000000241830     0 OBJECT  LOCAL  DEFAULT   14 __FRAME_END__
    24: 0000000000245260     0 OBJECT  LOCAL  HIDDEN    24 __TMC_END__                                      24: 0000000000245260     0 OBJECT  LOCAL  HIDDEN    24 __TMC_END__
    25: 0000000000242a40     5 FUNC    LOCAL  HIDDEN    15 _dl_relocate_static_pie                          25: 0000000000242a40     5 FUNC    LOCAL  HIDDEN    15 _dl_relocate_static_pie
    26: 0000000000245260     0 NOTYPE  LOCAL  HIDDEN    25 _GLOBAL_OFFSET_TABLE_                            26: 0000000000245260     0 NOTYPE  LOCAL  HIDDEN    25 _GLOBAL_OFFSET_TABLE_
    27: 0000000000244038     0 NOTYPE  LOCAL  HIDDEN    20 __init_array_start                               27: 0000000000244038     0 NOTYPE  LOCAL  HIDDEN    20 __init_array_start
    28: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    20 __init_array_end                                 28: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    20 __init_array_end
    29: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    21 _DYNAMIC                                         29: 0000000000244050     0 NOTYPE  LOCAL  HIDDEN    21 _DYNAMIC
    30: 0000000000242f34     0 FUNC    LOCAL  HIDDEN    16 _init                                            30: 0000000000242f34     0 FUNC    LOCAL  HIDDEN    16 _init
    31: 0000000000242f50     0 FUNC    LOCAL  HIDDEN    17 _fini                                            31: 0000000000242f50     0 FUNC    LOCAL  HIDDEN    17 _fini
    32: 0000000000242f20    18 FUNC    LOCAL  HIDDEN    15 atexit                                           32: 0000000000242f20    18 FUNC    LOCAL  HIDDEN    15 atexit
    33: 0000000000242f10     5 FUNC    GLOBAL DEFAULT   15 __libc_csu_fini                                  33: 0000000000242f10     5 FUNC    GLOBAL DEFAULT   15 __libc_csu_fini
    34: 0000000000242a10    47 FUNC    GLOBAL DEFAULT   15 _start                                           34: 0000000000242a10    47 FUNC    GLOBAL DEFAULT   15 _start
    35: 0000000000242ea0   101 FUNC    GLOBAL DEFAULT   15 __libc_csu_init                                  35: 0000000000242ea0   101 FUNC    GLOBAL DEFAULT   15 __libc_csu_init
    36: 0000000000242b60   434 FUNC    GLOBAL DEFAULT   15 main                                             36: 0000000000242b60   434 FUNC    GLOBAL DEFAULT   15 main
    37: 0000000000245250     0 NOTYPE  WEAK   DEFAULT   23 data_start                                       37: 0000000000245250     0 NOTYPE  WEAK   DEFAULT   23 data_start
    38: 0000000000200830     4 OBJECT  GLOBAL DEFAULT   10 _IO_stdin_used                                   38: 0000000000200830     4 OBJECT  GLOBAL DEFAULT   10 _IO_stdin_used
    39: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main                                39: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main
    40: 0000000000245250     0 NOTYPE  GLOBAL DEFAULT   23 __data_start                                     40: 0000000000245250     0 NOTYPE  GLOBAL DEFAULT   23 __data_start
    41: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__                                   41: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    42: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable                      42: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
    43: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable                        43: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
    44: 0000000000242b00    90 FUNC    GLOBAL DEFAULT   15 _Z22__device_stub__source2i                      44: 0000000000242b00    90 FUNC    GLOBAL DEFAULT   15 _Z22__device_stub__source2i
    45: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPopCallConfiguration                        45: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPopCallConfiguration
    46: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipLaunchKernel                                  46: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipLaunchKernel
    47: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf                                           47: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf
    48: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPushCallConfiguration                       48: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipPushCallConfiguration
    49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMalloc                                        49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMalloc
    50: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemset                                        50: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemset
    51: 0000000000242da0    88 FUNC    GLOBAL DEFAULT   15 _Z22__device_stub__source1Pi                     51: 0000000000242da0    88 FUNC    GLOBAL DEFAULT   15 _Z22__device_stub__source1Pi
    52: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemcpy                                        52: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipMemcpy
    53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipDeviceSynchronize                             53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND hipDeviceSynchronize
    54: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFatBinary                           54: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFatBinary
    55: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFunction                            55: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipRegisterFunction
    56: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipUnregisterFatBinary                         56: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __hipUnregisterFatBinary
    57: 0000000000242e80     1 FUNC    GLOBAL DEFAULT   15 _ZN11device_data8allocateEmP12ihipStr            57: 0000000000242e80     1 FUNC    GLOBAL DEFAULT   15 _ZN11device_data8allocateEmP12ihipStr
    58: 0000000000242e90     1 FUNC    GLOBAL DEFAULT   15 _ZN11device_data10deallocateEP12ihipS            58: 0000000000242e90     1 FUNC    GLOBAL DEFAULT   15 _ZN11device_data10deallocateEP12ihipS
    59: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit                                     59: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_atexit

Version symbols section '.gnu.version' contains 17 entries:                                             Version symbols section '.gnu.version' contains 17 entries:
 Addr: 0x0000000000200480  Offset: 0x000480  Link: 3 (.dynsym)                                     |     Addr: 0x0000000000200480  Offset: 0x000480  Link: 4 (.dynsym)
  000:   0 (*local*)       2 (GLIBC_2.2.5)   1 (*global*)      1 (*global*)                               000:   0 (*local*)       2 (GLIBC_2.2.5)   1 (*global*)      1 (*global*)   
  004:   1 (*global*)      3 (hip_4.2)       3 (hip_4.2)       2 (GLIBC_2.2.5)                            004:   1 (*global*)      3 (hip_4.2)       3 (hip_4.2)       2 (GLIBC_2.2.5)
  008:   3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)                                008:   3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)    
  00c:   3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)                                00c:   3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)       3 (hip_4.2)    
  010:   2 (GLIBC_2.2.5)                                                                                  010:   2 (GLIBC_2.2.5)

Version needs section '.gnu.version_r' contains 2 entries:                                              Version needs section '.gnu.version_r' contains 2 entries:
 Addr: 0x00000000002004a4  Offset: 0x0004a4  Link: 7 (.dynstr)                                     |     Addr: 0x00000000002004a4  Offset: 0x0004a4  Link: 8 (.dynstr)
  000000: Version: 1  File: libamdhip64.so.4  Cnt: 1                                                      000000: Version: 1  File: libamdhip64.so.4  Cnt: 1
  0x0020:   Name: hip_4.2  Flags: none  Version: 3                                                        0x0020:   Name: hip_4.2  Flags: none  Version: 3
  0x0010: Version: 1  File: libc.so.6  Cnt: 1                                                             0x0010: Version: 1  File: libc.so.6  Cnt: 1
  0x0030:   Name: GLIBC_2.2.5  Flags: none  Version: 2                                                    0x0030:   Name: GLIBC_2.2.5  Flags: none  Version: 2

Displaying notes found in: .note.ABI-tag                                                                Displaying notes found in: .note.ABI-tag
  Owner                Data size        Description                                                       Owner                Data size        Description
  GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)            OS: Linux, A          GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)            OS: Linux, A

Great news! The outputs look pretty identical! Did you try to actually run the result file?

For future reference, I am moving the item to 'Discussions'