18f26e7cf9
These are changes from two commits from the upstream clink repo (https://github.com/mkostoevr/clink) and one commit from the upstream epep repo (https://github.com/mkostoevr/epep). clink: Commit e63ed12ead17e47d77e848da0e7b9f4dd3ad5127 Bugfix: Make it able to write more than 64k - 1 COFF relocations If the relocation count is greater than 0xffff then it can't fit in the NumberOfRelocations field of a section header. In order to specify greater relocation count IMAGE_SCN_LNK_NRELOC_OVFL flag should be added to Characteristics and the actual relocation count should be written into VirtualAddress field of the first COFF relocation. Commit 328fc3112a30fcaa808f2cad34028a6507d602a3 Bugfix: Make it able to read more than 64k - 1 COFF relocations New EPEP API allows to read more than 64k - 1 relocations. Use it when reading relocation count for filling SectionInfo and when reading relocations for wriring the output file. epep: Commit 3bed4e348a486c346d0a452c58c1d85e1805c09d Feature: Higher-level COFF relocations API Number of COFF relocations of a section is stored in the 16-bit NumberOfRelocations field of a section header. If a COFF object has more than 2^16 - 1 relocations, then the value does not fit in the field. To solve this problem, IMAGE_SCN_LNK_NRELOC_OVFL flag of a section header has been introduced. If this flag is set for the section, then the actual number of relocations is stored in the VirtualAddress field of the first relocation. If the flag is set, then NumberOfRelocations field of the section header should be equal to 0xffff, othervice the linker should give an error. So this patch introduces few functions adressing this mechanism. epep_section_contains_extended_relocations: Checks whether the section has more than 2^16 - 1 relocations. Retrns error if the IMAGE_SCN_LNK_NRELOC_OVFL flag is set, but the NumberOfRelocations field is not equal to 0xffff. epep_get_section_extended_number_of_relocations: Reads the number of COFF relocations from the VirtualAddress field of the first COFF relocation. epep_get_section_number_of_relocations_x: Gives the number of meaningful relocations of the section. If the section has less than 2^16 relocations, then returns the value of the NumberOfRelocations field of the section header, othervice reads the number of relocations from the first COFF relocation, but: since the first relocation in this case is not meaningful, gives the actual number of relocations minus one. This is used in the function documented below. Returns 1 in the last argument if the section contains extended number of relocations, 0 othervice. epep_get_section_relocation_by_index_x: If the section has less than 2^16 relocations, then just reads a relocation by the given index. In case if the section has extended number of relocations, the first relocation is not meaningful, so it is skipped, and the relocation at index + 1 is read instead. git-svn-id: svn://kolibrios.org@9927 a494cfbc-eb01-0410-851d-a64ba20cac60 |
||
---|---|---|
.. | ||
epep.h | ||
example.c | ||
LICENSE | ||
README.md |
epep - Embeddable PE Parser
Features
- PE header (including Data Directories as a part Optional Header)
- Section Headers
- COFF Symbols
- Imports
- Exports
- Base relocations (DLL)
How to use
To declare functions from the library include it:
#include "epep.h"
The functions they shoud be instantiated somewhere in the project like so:
#define EPEP_INST
#include "epep.h"