Skip to content

Commit 975d584

Browse files
authored
Merge pull request #52 from gbaraldi/gb/symbol_offset
Add symbol offset function
2 parents 47c7295 + 3eef60e commit 975d584

File tree

12 files changed

+72
-12
lines changed

12 files changed

+72
-12
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ version = "0.4.4"
77
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
88
StructIO = "53d494c1-5632-5724-8f4c-31dff12d585f"
99

10-
1110
[compat]
1211
Reexport = "0.2, 1.0"
1312
StructIO = "0.3"
1413
julia = "1.6"
1514

1615
[extras]
1716
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
17+
Mmap = "a63ad114-7e13-5084-954f-fe012c677804"
1818

1919
[targets]
20-
test = ["Test"]
20+
test = ["Test", "Mmap"]

src/Abstract/Symbol.jl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export Symbols,
1010

1111
# Export SymtabEntry API
1212
export SymtabEntry,
13-
deref, symbol_name, symbol_value, isundef, isglobal, islocal, isweak
13+
deref, symbol_name, symbol_value, isundef, isglobal, islocal, isweak, symbol_section, symbol_offset
1414

1515
# Export SymbolRef API
1616
export SymbolRef,
@@ -161,6 +161,19 @@ Return the value of the given symbol
161161
"""
162162
@mustimplement symbol_value(sym::SymtabEntry)
163163

164+
"""
165+
symbol_section(sym::SymtabEntry)
166+
Return the section that this symbol refers to
167+
"""
168+
@mustimplement symbol_section(sym::SymtabEntry)
169+
170+
"""
171+
symbol_offset(sym::SymtabEntry)
172+
Return the offset into the file that this symbol refers to.
173+
"""
174+
@mustimplement symbol_offset(sym::SymtabEntry)
175+
176+
164177
"""
165178
isundef(sym::SymtabEntry)
166179

src/COFF/COFF.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import ObjectFile: DynamicLink, DynamicLinks, RPath, ObjectHandle, Section, Sect
1717
findfirst, deref, section_name, section_size,
1818
section_offset, section_address, section_number, segment_name, segment_offset,
1919
segment_file_size, segment_memory_size, segment_address, strtab_lookup,
20-
symbol_name, symbol_value, isundef, isglobal, islocal, isweak, symbol_number
20+
symbol_name, symbol_value, isundef, isglobal, islocal, isweak, symbol_number, symbol_section, symbol_offset
2121
# Load in imported C #define constants
2222
include("constants.jl")
2323

src/COFF/COFFSymbol.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ function symbol_name(sym::COFFSymtabEntry)
8080
end
8181

8282
symbol_value(sym::COFFSymtabEntry) = sym.Value
83-
symbol_section(sym::COFFSymtabEntry) = sym.SectionNumber
8483
symbol_type(sym::COFFSymtabEntry) = sym.Type
8584
function isundef(sym::COFFSymtabEntry)
8685
sym.StorageClass in (
@@ -112,6 +111,7 @@ end
112111
deref(sym::COFFSymbolRef) = sym.entry
113112
Symbols(sym::COFFSymbolRef) = sym.syms
114113
symbol_number(sym::COFFSymbolRef) = sym.idx
114+
symbol_section(sym::COFFSymbolRef) = Sections(handle(sym))[deref(sym).SectionNumber]
115115
@derefmethod symbol_type(sym::COFFSymbolRef)
116116
function symbol_name(sym::COFFSymbolRef)
117117
# COFF Symbols set the first four bytes of the name to zero to signify a
@@ -127,6 +127,10 @@ function symbol_name(sym::COFFSymbolRef)
127127
return unsafe_string(name)
128128
end
129129

130+
function symbol_offset(sym::COFFSymbolRef)
131+
# Return the offset into the file that this symbol refers to
132+
return symbol_value(sym) + section_offset(symbol_section(sym))
133+
end
130134

131135
# Symbol printing stuff
132136
"""
@@ -161,7 +165,7 @@ function symbol_type_string(sym::COFFSymtabEntry)
161165
if isempty(type_string)
162166
string("Unknown Symbol Type (0x", string(sym.Type, base=16), ")")
163167
end
164-
168+
165169
return type_string
166170
end
167171
@derefmethod symbol_type_string(s::COFFSymbolRef)

src/ELF/ELF.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import ObjectFile: DynamicLink, DynamicLinks, RPath, ObjectHandle, Section, Sect
1717
findfirst, deref, section_name, section_size,
1818
section_offset, section_address, section_number, segment_name, segment_offset,
1919
segment_file_size, segment_memory_size, segment_address, strtab_lookup,
20-
symbol_name, symbol_value, isundef, isglobal, islocal, isweak, symbol_number
20+
symbol_name, symbol_value, isundef, isglobal, islocal, isweak, symbol_number, symbol_section, symbol_offset
2121
# Load in imported C #define constants
2222
include("constants.jl")
2323

src/ELF/ELFSymbol.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function Symbols(oh::H) where {H <: ELFHandle}
2727
if !isempty(dyn_sections)
2828
return ELFSymbols(first(dyn_sections))
2929
end
30-
30+
3131
dyn_sections = findall(sections, ".dynsym")
3232
if !isempty(dyn_sections)
3333
return ELFSymbols(first(dyn_sections))
@@ -176,3 +176,10 @@ function symbol_value(sym::ELFSymbolRef)
176176
# Return our ill-gotten goods
177177
return value
178178
end
179+
180+
function symbol_offset(sym::ELFSymbolRef)
181+
addr = symbol_value(sym)
182+
sect = symbol_section(sym)
183+
virtual_offset = section_address(sect) - section_offset(sect)
184+
return addr - virtual_offset
185+
end

src/MachO/MachO.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import ObjectFile: DynamicLink, DynamicLinks, RPath, ObjectHandle, Section, Sect
1717
findfirst, deref, section_name, section_size,
1818
section_offset, section_address, section_number, segment_name, segment_offset,
1919
segment_file_size, segment_memory_size, segment_address, strtab_lookup,
20-
symbol_name, symbol_value, isundef, isglobal, islocal, isweak, symbol_number
20+
symbol_name, symbol_value, isundef, isglobal, islocal, isweak, symbol_number, symbol_section, symbol_offset
2121
# Load in imported C #define constants
2222
include("constants.jl")
2323

src/MachO/MachOSymbol.jl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ end
2525
symbol_name(sym::MachOSymtabEntry) = string("strtab@", sym.n_strx)
2626
symbol_value(sym::MachOSymtabEntry) = sym.n_value
2727
symbol_type(sym::MachOSymtabEntry) = sym.n_type
28-
symbol_section(sym::MachOSymtabEntry) = sym.n_sect
2928
symbol_description(sym::MachOSymtabEntry) = sym.n_desc
3029

3130
function isglobal(sym::MachOSymtabEntry)
@@ -39,7 +38,7 @@ function isweak(sym::MachOSymtabEntry)
3938
end
4039
function isundef(sym::MachOSymtabEntry)
4140
return (symbol_type(sym) == N_UNDF) ||
42-
(isglobal(sym) && symbol_section(sym) == NO_SECT)
41+
(isglobal(sym) && sym.n_sect == NO_SECT)
4342
end
4443

4544

@@ -115,6 +114,23 @@ end
115114
deref(sym::MachOSymbolRef) = sym.entry
116115
Symbols(sym::MachOSymbolRef) = sym.syms
117116
symbol_number(sym::MachOSymbolRef) = sym.idx
117+
118+
function symbol_section(sym::MachOSymbolRef)
119+
# MachO uses 0 to indicate no section, so we use NO_SECT
120+
if deref(sym).n_sect == 0
121+
return NO_SECT
122+
end
123+
return Sections(handle(sym))[deref(sym).n_sect]
124+
end
125+
118126
function symbol_name(sym::MachOSymbolRef)
119127
return strtab_lookup(StrTab(Symbols(sym)), sym.entry.n_strx)
120-
end
128+
end
129+
130+
function symbol_offset(sym::MachOSymbolRef)
131+
addr = symbol_value(sym)
132+
sect = symbol_section(sym)
133+
virtual_offset = section_address(sect) - section_offset(sect)
134+
return addr - virtual_offset
135+
end
136+

test/libjulias/libjulia.1.10.10.dylib

229 KB
Binary file not shown.

test/libjulias/libjulia.dll

229 KB
Binary file not shown.

0 commit comments

Comments
 (0)