| # What are these files? |
| |
| These files are the DWARF data generated for (an early version of) this |
| library. Each file corresponds is a section from the built library's object |
| file. By splitting the sections out to their own files, we don't need to worry |
| about cross platform and cross object file format issues when running examples. |
| |
| # Updating and adding new sections |
| |
| ## OSX |
| |
| Use `otool` to list the sections of a binary: |
| |
| ``` |
| $ otool -l path/to/binary |
| ``` |
| |
| You should see output similar to this: |
| |
| ``` |
| Load command 0 |
| cmd LC_SEGMENT_64 |
| cmdsize 72 |
| segname __PAGEZERO |
| vmaddr 0x0000000000000000 |
| vmsize 0x0000000100000000 |
| fileoff 0 |
| filesize 0 |
| maxprot 0x00000000 |
| initprot 0x00000000 |
| nsects 0 |
| flags 0x0 |
| Load command 1 |
| cmd LC_SEGMENT_64 |
| cmdsize 712 |
| segname __TEXT |
| vmaddr 0x0000000100000000 |
| vmsize 0x00000000001b7000 |
| fileoff 0 |
| filesize 1798144 |
| maxprot 0x00000007 |
| initprot 0x00000005 |
| nsects 8 |
| flags 0x0 |
| Section |
| sectname __text |
| segname __TEXT |
| addr 0x0000000100000a50 |
| size 0x0000000000170716 |
| offset 2640 |
| align 2^4 (16) |
| reloff 0 |
| nreloc 0 |
| flags 0x80000400 |
| reserved1 0 |
| reserved2 0 |
| ``` |
| |
| Etc. |
| |
| Find the `Section` entry of the section you'd like to isolate. For example, if |
| you're looking for `eh_frame`, find an entry like this: |
| |
| ``` |
| Section |
| sectname __eh_frame |
| segname __TEXT |
| addr 0x0000000100192f38 |
| size 0x00000000000240c8 |
| offset 1650488 |
| align 2^3 (8) |
| reloff 0 |
| nreloc 0 |
| flags 0x00000000 |
| reserved1 0 |
| reserved2 0 |
| ``` |
| |
| Then use `dd` to copy `size` bytes starting from `offset`: |
| |
| ``` |
| $ dd bs=1 skip=1650488 count=$(printf "%d" 0x00000000000240c8) if=path/to/binary of=fixtures/self/eh_frame |
| ``` |
| |
| Finally, use `otool` and `hexdump` to verify that the isolated section has the |
| same data as the section within the binary: |
| |
| ``` |
| $ otool -s __TEXT __eh_frame path/to/binary | head |
| path/to/binary: |
| Contents of (__TEXT,__eh_frame) section |
| 0000000100192f38 14 00 00 00 00 00 00 00 01 7a 52 00 01 78 10 01 |
| 0000000100192f48 10 0c 07 08 90 01 00 00 24 00 00 00 1c 00 00 00 |
| 0000000100192f58 f8 da e6 ff ff ff ff ff 66 00 00 00 00 00 00 00 |
| 0000000100192f68 00 41 0e 10 86 02 43 0d 06 00 00 00 00 00 00 00 |
| 0000000100192f78 1c 00 00 00 00 00 00 00 01 7a 50 4c 52 00 01 78 |
| 0000000100192f88 10 07 9b 9d 40 02 00 10 10 0c 07 08 90 01 00 00 |
| 0000000100192f98 2c 00 00 00 24 00 00 00 20 db e6 ff ff ff ff ff |
| 0000000100192fa8 8d 00 00 00 00 00 00 00 08 37 e7 fd ff ff ff ff |
| |
| $ otool -s __TEXT __eh_frame path/to/binary | tail |
| 00000001001b6f68 9a 0a 00 00 00 00 00 00 00 41 0e 10 86 02 43 0d |
| 00000001001b6f78 06 50 83 07 8c 06 8d 05 8e 04 8f 03 00 00 00 00 |
| 00000001001b6f88 24 00 00 00 7c 0e 00 00 30 a0 fb ff ff ff ff ff |
| 00000001001b6f98 15 00 00 00 00 00 00 00 00 41 0e 10 86 02 43 0d |
| 00000001001b6fa8 06 00 00 00 00 00 00 00 24 00 00 00 a4 0e 00 00 |
| 00000001001b6fb8 28 a0 fb ff ff ff ff ff 1c 00 00 00 00 00 00 00 |
| 00000001001b6fc8 00 41 0e 10 86 02 43 0d 06 00 00 00 00 00 00 00 |
| 00000001001b6fd8 24 00 00 00 cc 0e 00 00 20 a0 fb ff ff ff ff ff |
| 00000001001b6fe8 66 01 00 00 00 00 00 00 00 41 0e 10 86 02 43 0d |
| 00000001001b6ff8 06 00 00 00 00 00 00 00 |
| ``` |
| |
| This should be the same, ignoring the leading offsets: |
| |
| ``` |
| $ hexdump fixtures/self/eh_frame | head |
| 0000000 14 00 00 00 00 00 00 00 01 7a 52 00 01 78 10 01 |
| 0000010 10 0c 07 08 90 01 00 00 24 00 00 00 1c 00 00 00 |
| 0000020 f8 da e6 ff ff ff ff ff 66 00 00 00 00 00 00 00 |
| 0000030 00 41 0e 10 86 02 43 0d 06 00 00 00 00 00 00 00 |
| 0000040 1c 00 00 00 00 00 00 00 01 7a 50 4c 52 00 01 78 |
| 0000050 10 07 9b 9d 40 02 00 10 10 0c 07 08 90 01 00 00 |
| 0000060 2c 00 00 00 24 00 00 00 20 db e6 ff ff ff ff ff |
| 0000070 8d 00 00 00 00 00 00 00 08 37 e7 fd ff ff ff ff |
| 0000080 ff 41 0e 10 86 02 43 0d 06 00 00 00 00 00 00 00 |
| 0000090 24 00 00 00 94 00 00 00 80 db e6 ff ff ff ff ff |
| |
| $ hexdump fixtures/self/eh_frame | tail |
| 0024040 06 50 83 07 8c 06 8d 05 8e 04 8f 03 00 00 00 00 |
| 0024050 24 00 00 00 7c 0e 00 00 30 a0 fb ff ff ff ff ff |
| 0024060 15 00 00 00 00 00 00 00 00 41 0e 10 86 02 43 0d |
| 0024070 06 00 00 00 00 00 00 00 24 00 00 00 a4 0e 00 00 |
| 0024080 28 a0 fb ff ff ff ff ff 1c 00 00 00 00 00 00 00 |
| 0024090 00 41 0e 10 86 02 43 0d 06 00 00 00 00 00 00 00 |
| 00240a0 24 00 00 00 cc 0e 00 00 20 a0 fb ff ff ff ff ff |
| 00240b0 66 01 00 00 00 00 00 00 00 41 0e 10 86 02 43 0d |
| 00240c0 06 00 00 00 00 00 00 00 |
| ``` |
| |
| ## Linux |
| |
| Something like this: |
| |
| ``` |
| objcopy --dump-section .eh_frame=fixtures/self/eh_frame path/to/binary |
| ``` |