-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSharedLibrarySymbol.lua
More file actions
48 lines (46 loc) · 2.71 KB
/
Copy pathSharedLibrarySymbol.lua
File metadata and controls
48 lines (46 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
local ELFSectionHeaderTable32 = require("ELFSectionHeaderTable32")
local ELFSectionHeaderTable64 = require("ELFSectionHeaderTable64")
local SymbolDynamicSectionTable32 = require("SymbolDynamicSectionTable32")
local SymbolDynamicSectionTable64 = require("SymbolDynamicSectionTable64")
local ELFHeader32 = require("ELFHeader32")
local ELFHeader64 = require("ELFHeader64")
local FileReader = require("FileReader")
local BigEndianHandler = require("BigEndianHandler")
local LittleEndianHandler = require("LittleEndianHandler")
local Symbol = require("Symbol")
local SharedLibrarySymbol = {}
function SharedLibrarySymbol.create(path)
local fileReader = FileReader:new(nil, path, "rb")
local bytesMagic = fileReader:readDataByOffset(0, 4)
local data = fileReader:readByteByOffset(5)
fileReader:setBytesHandler(data == 1 and LittleEndianHandler:new() or BigEndianHandler:new())
if bytesMagic == "\x7fELF" then
local header, sectionHeader, informationDynamicLinkingSections;
local class = fileReader:readByteByOffset(4)
local symbolDynamicSectionTable = nil
local symbolInformation = nil
local symbol = nil
local dynstr = nil
if class == 1 then
header = ELFHeader32:new(nil, fileReader)
sectionHeader = ELFSectionHeaderTable32:new(nil, fileReader, header)
informationDynamicLinkingSections = sectionHeader:readInformationDynamicLinkingSections()
symbolDynamicSectionTable = SymbolDynamicSectionTable32:new(nil, fileReader, informationDynamicLinkingSections.dynsym)
symbolInformation = symbolDynamicSectionTable:readInformationFromSymbols()
dynstr = fileReader:readDataByOffset(informationDynamicLinkingSections.dynstr.offset, informationDynamicLinkingSections.dynstr.size)
symbol = Symbol:new(nil, dynstr, symbolInformation)
elseif class == 2 then
header = ELFHeader64:new(nil, fileReader)
sectionHeader = ELFSectionHeaderTable64:new(nil, fileReader, header)
informationDynamicLinkingSections = sectionHeader:readInformationDynamicLinkingSections()
symbolDynamicSectionTable = SymbolDynamicSectionTable64:new(nil, fileReader, informationDynamicLinkingSections.dynsym)
symbolInformation = symbolDynamicSectionTable:readInformationFromSymbols()
dynstr = fileReader:readDataByOffset(informationDynamicLinkingSections.dynstr.offset, informationDynamicLinkingSections.dynstr.size)
symbol = Symbol:new(nil, dynstr, symbolInformation)
end
local symbolTable = symbol:getSymbolTable()
fileReader:close()
return symbolTable
end
end
return SharedLibrarySymbol