elf-mithril 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/mithril-ld +76 -0
- data/bin/mithril-rewrite +14 -0
- data/bin/mithril-section-symbols +12 -0
- data/lib/mithril.rb +6 -0
- data/lib/mithril/elf.rb +220 -0
- data/lib/mithril/elf_enums.rb +581 -0
- data/lib/mithril/elf_generative.rb +0 -0
- data/lib/mithril/elf_structs.rb +335 -0
- data/lib/mithril/inject_symbols.rb +22 -0
- data/lib/mithril/parser.rb +706 -0
- data/lib/mithril/policy.rb +335 -0
- data/lib/mithril/version.rb +3 -0
- data/lib/mithril/writer.rb +774 -0
- data/lib/mithril/writer2.rb +29 -0
- data/mithril.gemspec +30 -0
- data/test/hash_test.rb +7 -0
- data/tools/#elf_enums.sh# +26 -0
- data/tools/elf.h +991 -0
- data/tools/elf_enums.sh +26 -0
- data/tools/elf_h_processor.sh +5 -0
- data/tools/elf_structs.sh +1 -0
- data/tools/gnu_elf_hash_test +0 -0
- data/tools/gnu_elf_hash_test.cxx +22 -0
- data/tools/hash_test +0 -0
- data/tools/hash_test.c +70 -0
- metadata +192 -0
data/tools/elf_enums.sh
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
define_enum() {
|
3
|
+
echo "class $2 < Enum # $1"
|
4
|
+
grep "[[:space:]]$1" elf.h | awk '{print $2, " = ", $3}'
|
5
|
+
echo "end"
|
6
|
+
}
|
7
|
+
|
8
|
+
define_enum EV_ Version
|
9
|
+
define_enum ELFCLASS IdentClass
|
10
|
+
define_enum ELFDATA IdentData
|
11
|
+
define_enum ELFOSABI OsAbi
|
12
|
+
define_enum ET_ Type
|
13
|
+
define_enum EM_ Machine
|
14
|
+
define_enum SHN_ SpecialSection
|
15
|
+
define_enum SHT_ SectionType
|
16
|
+
define_enum SHF_ SectionFlags
|
17
|
+
define_enum PT_ PhdrType
|
18
|
+
define_enum PF_ PhdrFlags
|
19
|
+
define_enum DT_ DynamicType
|
20
|
+
define_enum DF_ DynamicFlags
|
21
|
+
define_enum NT_ CoreNType
|
22
|
+
define_enum STB_ SymbolBinding
|
23
|
+
define_enum STT_ SymbolType
|
24
|
+
define_enum STV_ SymbolVisibility
|
25
|
+
define_enum STN_ SymbolName
|
26
|
+
define_enum R_ Relocation
|
@@ -0,0 +1 @@
|
|
1
|
+
#!/bin/bash
|
Binary file
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <stdint.h>
|
3
|
+
uint32_t
|
4
|
+
dl_new_hash (const char *s)
|
5
|
+
{
|
6
|
+
uint32_t h = 5381;
|
7
|
+
|
8
|
+
for (unsigned char c = *s; c != '\0'; c = *++s)
|
9
|
+
h = h * 33 + c;
|
10
|
+
|
11
|
+
return h;
|
12
|
+
}
|
13
|
+
|
14
|
+
int main(){
|
15
|
+
while(!feof(stdin)){
|
16
|
+
char buf[1024];
|
17
|
+
scanf("%1024s",buf);
|
18
|
+
unsigned long ehash1 = dl_new_hash(buf);
|
19
|
+
printf("%lu \n",ehash1);
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
data/tools/hash_test
ADDED
Binary file
|
data/tools/hash_test.c
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
unsigned long
|
3
|
+
elf_hash(const unsigned char *name)
|
4
|
+
{
|
5
|
+
unsigned long h = 0, g;
|
6
|
+
while (*name)
|
7
|
+
{
|
8
|
+
h = (h << 4) + *name++;
|
9
|
+
if (g = h & 0xf0000000)
|
10
|
+
h ^= g >> 24;
|
11
|
+
h &= ~g;
|
12
|
+
}
|
13
|
+
return h;
|
14
|
+
}
|
15
|
+
static unsigned int
|
16
|
+
_dl_elf_hash (const char *name_arg)
|
17
|
+
{
|
18
|
+
const unsigned char *name = (const unsigned char *) name_arg;
|
19
|
+
unsigned long int hash = *name;
|
20
|
+
if (hash != 0 && name[1] != '\0')
|
21
|
+
{
|
22
|
+
hash = (hash << 4) + name[1];
|
23
|
+
if (name[2] != '\0')
|
24
|
+
{
|
25
|
+
hash = (hash << 4) + name[2];
|
26
|
+
if (name[3] != '\0')
|
27
|
+
{
|
28
|
+
hash = (hash << 4) + name[3];
|
29
|
+
if (name[4] != '\0')
|
30
|
+
{
|
31
|
+
hash = (hash << 4) + name[4];
|
32
|
+
name += 5;
|
33
|
+
while (*name != '\0')
|
34
|
+
{
|
35
|
+
unsigned long int hi;
|
36
|
+
hash = (hash << 4) + *name++;
|
37
|
+
hi = hash & 0xf0000000;
|
38
|
+
|
39
|
+
/* The algorithm specified in the ELF ABI is as
|
40
|
+
follows:
|
41
|
+
|
42
|
+
if (hi != 0)
|
43
|
+
hash ^= hi >> 24;
|
44
|
+
|
45
|
+
hash &= ~hi;
|
46
|
+
|
47
|
+
But the following is equivalent and a lot
|
48
|
+
faster, especially on modern processors. */
|
49
|
+
|
50
|
+
hash ^= hi >> 24;
|
51
|
+
}
|
52
|
+
|
53
|
+
/* Second part of the modified formula. This
|
54
|
+
operation can be lifted outside the loop. */
|
55
|
+
hash &= 0x0fffffff;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
return hash;
|
61
|
+
}
|
62
|
+
int main(){
|
63
|
+
while(!feof(stdin)){
|
64
|
+
char buf[1024];
|
65
|
+
scanf("%1024s",buf);
|
66
|
+
unsigned long ehash1 = elf_hash(buf);
|
67
|
+
unsigned long ehash2 = _dl_elf_hash(buf);
|
68
|
+
printf("%lu\t %lu \n",ehash1,ehash2);
|
69
|
+
}
|
70
|
+
}
|
metadata
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: elf-mithril
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Julian Bangert
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: bindata
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.5.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.5.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: renum
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - '='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.4.0
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - '='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.4.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: andand
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: segment_tree
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rbtree-pure
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
description: In Soviet Russia, Mithril forges Elf
|
127
|
+
email:
|
128
|
+
- jbangert@acm.org
|
129
|
+
executables:
|
130
|
+
- mithril-ld
|
131
|
+
- mithril-rewrite
|
132
|
+
- mithril-section-symbols
|
133
|
+
extensions: []
|
134
|
+
extra_rdoc_files: []
|
135
|
+
files:
|
136
|
+
- .gitignore
|
137
|
+
- Gemfile
|
138
|
+
- LICENSE.txt
|
139
|
+
- README.md
|
140
|
+
- Rakefile
|
141
|
+
- bin/mithril-ld
|
142
|
+
- bin/mithril-rewrite
|
143
|
+
- bin/mithril-section-symbols
|
144
|
+
- lib/mithril.rb
|
145
|
+
- lib/mithril/elf.rb
|
146
|
+
- lib/mithril/elf_enums.rb
|
147
|
+
- lib/mithril/elf_generative.rb
|
148
|
+
- lib/mithril/elf_structs.rb
|
149
|
+
- lib/mithril/inject_symbols.rb
|
150
|
+
- lib/mithril/parser.rb
|
151
|
+
- lib/mithril/policy.rb
|
152
|
+
- lib/mithril/version.rb
|
153
|
+
- lib/mithril/writer.rb
|
154
|
+
- lib/mithril/writer2.rb
|
155
|
+
- mithril.gemspec
|
156
|
+
- test/hash_test.rb
|
157
|
+
- tools/#elf_enums.sh#
|
158
|
+
- tools/elf.h
|
159
|
+
- tools/elf_enums.sh
|
160
|
+
- tools/elf_h_processor.sh
|
161
|
+
- tools/elf_structs.sh
|
162
|
+
- tools/gnu_elf_hash_test
|
163
|
+
- tools/gnu_elf_hash_test.cxx
|
164
|
+
- tools/hash_test
|
165
|
+
- tools/hash_test.c
|
166
|
+
homepage: ''
|
167
|
+
licenses:
|
168
|
+
- MIT
|
169
|
+
post_install_message:
|
170
|
+
rdoc_options: []
|
171
|
+
require_paths:
|
172
|
+
- lib
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
none: false
|
175
|
+
requirements:
|
176
|
+
- - ! '>='
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
179
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
|
+
none: false
|
181
|
+
requirements:
|
182
|
+
- - ! '>='
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
requirements: []
|
186
|
+
rubyforge_project:
|
187
|
+
rubygems_version: 1.8.23
|
188
|
+
signing_key:
|
189
|
+
specification_version: 3
|
190
|
+
summary: The Mithril toolkit for canonical elf manipulation
|
191
|
+
test_files:
|
192
|
+
- test/hash_test.rb
|