@@ -44,55 +44,11 @@ static inline bool postject_has_resource() {
44
44
}
45
45
46
46
#if defined(__linux__ )
47
- struct postject__dl_iterate_phdr_data {
48
- void * data ;
49
- size_t size ;
50
- const char * elf_section_name ;
51
- size_t elf_section_name_size ;
52
- };
53
-
54
47
static int postject__dl_iterate_phdr_callback (struct dl_phdr_info * info ,
55
48
size_t size ,
56
- void * opaque ) {
57
- struct postject__dl_iterate_phdr_data * data =
58
- (struct postject__dl_iterate_phdr_data * )opaque ;
59
-
60
- // iterate program headers
61
- for (unsigned i = 0 ; i < info -> dlpi_phnum ; i ++ ) {
62
- // skip everything but notes
63
- if (info -> dlpi_phdr [i ].p_type != PT_NOTE )
64
- continue ;
65
-
66
- // note segment starts at base address + segment virtual address
67
- uintptr_t pos = (info -> dlpi_addr + info -> dlpi_phdr [i ].p_vaddr );
68
- uintptr_t end = (pos + info -> dlpi_phdr [i ].p_memsz );
69
-
70
- // iterate through segment until we reach the end
71
- while (pos < end ) {
72
- if (pos + sizeof (ElfW (Nhdr )) > end ) {
73
- break ; // invalid
74
- }
75
-
76
- ElfW (Nhdr )* note = (ElfW (Nhdr )* )(uintptr_t )pos ;
77
- if (note -> n_namesz != 0 && note -> n_descsz != 0 &&
78
- strncmp ((char * )(pos + sizeof (ElfW (Nhdr ))), data -> elf_section_name ,
79
- data -> elf_section_name_size ) == 0 ) {
80
- data -> size = note -> n_descsz ;
81
- // advance past note header and aligned name
82
- // to get to description data
83
- data -> data = (void * )((uintptr_t )note + sizeof (ElfW (Nhdr )) +
84
- roundup (note -> n_namesz , 4 ));
85
- // found the note, so terminate the search by returning 1
86
- return 1 ;
87
- }
88
-
89
- pos += (sizeof (ElfW (Nhdr )) + roundup (note -> n_namesz , 4 ) +
90
- roundup (note -> n_descsz , 4 ));
91
- }
92
- }
93
-
94
- // wasn't able to find the note in the main executable program headers, so
95
- // terminate the search
49
+ void * data ) {
50
+ // Snag the dl_phdr_info struct for the main program, then stop iterating
51
+ * ((struct dl_phdr_info * )data ) = * info ;
96
52
return 1 ;
97
53
}
98
54
#endif
@@ -167,14 +123,49 @@ static const void* postject_find_resource(
167
123
name = options -> elf_section_name ;
168
124
}
169
125
170
- struct postject__dl_iterate_phdr_data data ;
171
- data .data = NULL ;
172
- data .size = 0 ;
173
- data .elf_section_name = name ;
174
- data .elf_section_name_size = sizeof (name );
175
- dl_iterate_phdr (postject__dl_iterate_phdr_callback , & data );
176
- * size = data .size ;
177
- return data .data ;
126
+ struct dl_phdr_info main_program_info ;
127
+ dl_iterate_phdr (postject__dl_iterate_phdr_callback , & main_program_info );
128
+
129
+ uintptr_t p = (uintptr_t )main_program_info .dlpi_phdr ;
130
+ size_t n = main_program_info .dlpi_phnum ;
131
+ uintptr_t base_addr = main_program_info .dlpi_addr ;
132
+
133
+ // iterate program header
134
+ for (; n > 0 ; n -- , p += sizeof (ElfW (Phdr ))) {
135
+ ElfW (Phdr )* phdr = (ElfW (Phdr )* )p ;
136
+
137
+ // skip everything but notes
138
+ if (phdr -> p_type != PT_NOTE ) {
139
+ continue ;
140
+ }
141
+
142
+ // note segment starts at base address + segment virtual address
143
+ uintptr_t pos = (base_addr + phdr -> p_vaddr );
144
+ uintptr_t end = (pos + phdr -> p_memsz );
145
+
146
+ // iterate through segment until we reach the end
147
+ while (pos < end ) {
148
+ if (pos + sizeof (ElfW (Nhdr )) > end ) {
149
+ break ; // invalid
150
+ }
151
+
152
+ ElfW (Nhdr )* note = (ElfW (Nhdr )* )(uintptr_t )pos ;
153
+ if (note -> n_namesz != 0 && note -> n_descsz != 0 &&
154
+ strncmp ((char * )(pos + sizeof (ElfW (Nhdr ))), (char * )name ,
155
+ sizeof (name )) == 0 ) {
156
+ * size = note -> n_descsz ;
157
+ // advance past note header and aligned name
158
+ // to get to description data
159
+ return (void * )((uintptr_t )note + sizeof (ElfW (Nhdr )) +
160
+ roundup (note -> n_namesz , 4 ));
161
+ }
162
+
163
+ pos += (sizeof (ElfW (Nhdr )) + roundup (note -> n_namesz , 4 ) +
164
+ roundup (note -> n_descsz , 4 ));
165
+ }
166
+ }
167
+ return NULL ;
168
+
178
169
#elif defined(_WIN32 )
179
170
void * ptr = NULL ;
180
171
char * resource_name = NULL ;
0 commit comments