1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * elf.c - ELF access library
5 * Adapted from kpatch (https://github.com/dynup/kpatch):
6 * Copyright (C) 2013-2015 Josh Poimboeuf <jpoimboe@redhat.com>
7 * Copyright (C) 2014 Seth Jennings <sjenning@redhat.com>
10 #include <sys/types.h>
19 #include <linux/interval_tree_generic.h>
20 #include <objtool/builtin.h>
22 #include <objtool/elf.h>
23 #include <objtool/warn.h>
25 static inline u32
str_hash(const char *str
)
27 return jhash(str
, strlen(str
), 0);
30 #define __elf_table(name) (elf->name##_hash)
31 #define __elf_bits(name) (elf->name##_bits)
33 #define __elf_table_entry(name, key) \
34 __elf_table(name)[hash_min(key, __elf_bits(name))]
36 #define elf_hash_add(name, node, key) \
38 struct elf_hash_node *__node = node; \
39 __node->next = __elf_table_entry(name, key); \
40 __elf_table_entry(name, key) = __node; \
43 static inline void __elf_hash_del(struct elf_hash_node
*node
,
44 struct elf_hash_node
**head
)
46 struct elf_hash_node
*cur
, *prev
;
53 for (prev
= NULL
, cur
= *head
; cur
; prev
= cur
, cur
= cur
->next
) {
55 prev
->next
= cur
->next
;
61 #define elf_hash_del(name, node, key) \
62 __elf_hash_del(node, &__elf_table_entry(name, key))
64 #define elf_list_entry(ptr, type, member) \
66 typeof(ptr) __ptr = (ptr); \
67 __ptr ? container_of(__ptr, type, member) : NULL; \
70 #define elf_hash_for_each_possible(name, obj, member, key) \
71 for (obj = elf_list_entry(__elf_table_entry(name, key), typeof(*obj), member); \
73 obj = elf_list_entry(obj->member.next, typeof(*(obj)), member))
75 #define elf_alloc_hash(name, size) \
77 __elf_bits(name) = max(10, ilog2(size)); \
78 __elf_table(name) = mmap(NULL, sizeof(struct elf_hash_node *) << __elf_bits(name), \
79 PROT_READ|PROT_WRITE, \
80 MAP_PRIVATE|MAP_ANON, -1, 0); \
81 if (__elf_table(name) == (void *)-1L) { \
82 WARN("mmap fail " #name); \
83 __elf_table(name) = NULL; \
88 static inline unsigned long __sym_start(struct symbol
*s
)
93 static inline unsigned long __sym_last(struct symbol
*s
)
95 return s
->offset
+ s
->len
- 1;
98 INTERVAL_TREE_DEFINE(struct symbol
, node
, unsigned long, __subtree_last
,
99 __sym_start
, __sym_last
, static, __sym
)
101 #define __sym_for_each(_iter, _tree, _start, _end) \
102 for (_iter = __sym_iter_first((_tree), (_start), (_end)); \
103 _iter; _iter = __sym_iter_next(_iter, (_start), (_end)))
107 const struct symbol
*sym
;
111 * Find !section symbol where @offset is after it.
113 static int symbol_hole_by_offset(const void *key
, const struct rb_node
*node
)
115 const struct symbol
*s
= rb_entry(node
, struct symbol
, node
);
116 struct symbol_hole
*sh
= (void *)key
;
118 if (sh
->key
< s
->offset
)
121 if (sh
->key
>= s
->offset
+ s
->len
) {
122 if (s
->type
!= STT_SECTION
)
130 struct section
*find_section_by_name(const struct elf
*elf
, const char *name
)
134 elf_hash_for_each_possible(section_name
, sec
, name_hash
, str_hash(name
)) {
135 if (!strcmp(sec
->name
, name
))
142 static struct section
*find_section_by_index(struct elf
*elf
,
147 elf_hash_for_each_possible(section
, sec
, hash
, idx
) {
155 static struct symbol
*find_symbol_by_index(struct elf
*elf
, unsigned int idx
)
159 elf_hash_for_each_possible(symbol
, sym
, hash
, idx
) {
167 struct symbol
*find_symbol_by_offset(struct section
*sec
, unsigned long offset
)
169 struct rb_root_cached
*tree
= (struct rb_root_cached
*)&sec
->symbol_tree
;
172 __sym_for_each(iter
, tree
, offset
, offset
) {
173 if (iter
->offset
== offset
&& iter
->type
!= STT_SECTION
)
180 struct symbol
*find_func_by_offset(struct section
*sec
, unsigned long offset
)
182 struct rb_root_cached
*tree
= (struct rb_root_cached
*)&sec
->symbol_tree
;
185 __sym_for_each(iter
, tree
, offset
, offset
) {
186 if (iter
->offset
== offset
&& iter
->type
== STT_FUNC
)
193 struct symbol
*find_symbol_containing(const struct section
*sec
, unsigned long offset
)
195 struct rb_root_cached
*tree
= (struct rb_root_cached
*)&sec
->symbol_tree
;
198 __sym_for_each(iter
, tree
, offset
, offset
) {
199 if (iter
->type
!= STT_SECTION
)
207 * Returns size of hole starting at @offset.
209 int find_symbol_hole_containing(const struct section
*sec
, unsigned long offset
)
211 struct symbol_hole hole
= {
219 * Find the rightmost symbol for which @offset is after it.
221 n
= rb_find(&hole
, &sec
->symbol_tree
.rb_root
, symbol_hole_by_offset
);
223 /* found a symbol that contains @offset */
225 return 0; /* not a hole */
228 * @offset >= sym->offset + sym->len, find symbol after it.
229 * When hole.sym is empty, use the first node to compute the hole.
230 * If there is no symbol in the section, the first node will be NULL,
231 * in which case, -1 is returned to skip the whole section.
234 n
= rb_next(&hole
.sym
->node
);
236 n
= rb_first_cached(&sec
->symbol_tree
);
239 return -1; /* until end of address space */
241 /* hole until start of next symbol */
242 s
= rb_entry(n
, struct symbol
, node
);
243 return s
->offset
- offset
;
246 struct symbol
*find_func_containing(struct section
*sec
, unsigned long offset
)
248 struct rb_root_cached
*tree
= (struct rb_root_cached
*)&sec
->symbol_tree
;
251 __sym_for_each(iter
, tree
, offset
, offset
) {
252 if (iter
->type
== STT_FUNC
)
259 struct symbol
*find_symbol_by_name(const struct elf
*elf
, const char *name
)
263 elf_hash_for_each_possible(symbol_name
, sym
, name_hash
, str_hash(name
)) {
264 if (!strcmp(sym
->name
, name
))
271 struct reloc
*find_reloc_by_dest_range(const struct elf
*elf
, struct section
*sec
,
272 unsigned long offset
, unsigned int len
)
274 struct reloc
*reloc
, *r
= NULL
;
275 struct section
*rsec
;
282 for_offset_range(o
, offset
, offset
+ len
) {
283 elf_hash_for_each_possible(reloc
, reloc
, hash
,
284 sec_offset_hash(rsec
, o
)) {
285 if (reloc
->sec
!= rsec
)
288 if (reloc_offset(reloc
) >= offset
&&
289 reloc_offset(reloc
) < offset
+ len
) {
290 if (!r
|| reloc_offset(reloc
) < reloc_offset(r
))
301 struct reloc
*find_reloc_by_dest(const struct elf
*elf
, struct section
*sec
, unsigned long offset
)
303 return find_reloc_by_dest_range(elf
, sec
, offset
, 1);
306 static bool is_dwarf_section(struct section
*sec
)
308 return !strncmp(sec
->name
, ".debug_", 7);
311 static int read_sections(struct elf
*elf
)
315 size_t shstrndx
, sections_nr
;
318 if (elf_getshdrnum(elf
->elf
, §ions_nr
)) {
319 WARN_ELF("elf_getshdrnum");
323 if (elf_getshdrstrndx(elf
->elf
, &shstrndx
)) {
324 WARN_ELF("elf_getshdrstrndx");
328 if (!elf_alloc_hash(section
, sections_nr
) ||
329 !elf_alloc_hash(section_name
, sections_nr
))
332 elf
->section_data
= calloc(sections_nr
, sizeof(*sec
));
333 if (!elf
->section_data
) {
337 for (i
= 0; i
< sections_nr
; i
++) {
338 sec
= &elf
->section_data
[i
];
340 INIT_LIST_HEAD(&sec
->symbol_list
);
342 s
= elf_getscn(elf
->elf
, i
);
344 WARN_ELF("elf_getscn");
348 sec
->idx
= elf_ndxscn(s
);
350 if (!gelf_getshdr(s
, &sec
->sh
)) {
351 WARN_ELF("gelf_getshdr");
355 sec
->name
= elf_strptr(elf
->elf
, shstrndx
, sec
->sh
.sh_name
);
357 WARN_ELF("elf_strptr");
361 if (sec
->sh
.sh_size
!= 0 && !is_dwarf_section(sec
)) {
362 sec
->data
= elf_getdata(s
, NULL
);
364 WARN_ELF("elf_getdata");
367 if (sec
->data
->d_off
!= 0 ||
368 sec
->data
->d_size
!= sec
->sh
.sh_size
) {
369 WARN("unexpected data attributes for %s",
375 list_add_tail(&sec
->list
, &elf
->sections
);
376 elf_hash_add(section
, &sec
->hash
, sec
->idx
);
377 elf_hash_add(section_name
, &sec
->name_hash
, str_hash(sec
->name
));
379 if (is_reloc_sec(sec
))
380 elf
->num_relocs
+= sec_num_entries(sec
);
384 printf("nr_sections: %lu\n", (unsigned long)sections_nr
);
385 printf("section_bits: %d\n", elf
->section_bits
);
388 /* sanity check, one more call to elf_nextscn() should return NULL */
389 if (elf_nextscn(elf
->elf
, s
)) {
390 WARN("section entry mismatch");
397 static void elf_add_symbol(struct elf
*elf
, struct symbol
*sym
)
399 struct list_head
*entry
;
400 struct rb_node
*pnode
;
403 INIT_LIST_HEAD(&sym
->pv_target
);
406 sym
->type
= GELF_ST_TYPE(sym
->sym
.st_info
);
407 sym
->bind
= GELF_ST_BIND(sym
->sym
.st_info
);
409 if (sym
->type
== STT_FILE
)
412 sym
->offset
= sym
->sym
.st_value
;
413 sym
->len
= sym
->sym
.st_size
;
415 __sym_for_each(iter
, &sym
->sec
->symbol_tree
, sym
->offset
, sym
->offset
) {
416 if (iter
->offset
== sym
->offset
&& iter
->type
== sym
->type
)
420 __sym_insert(sym
, &sym
->sec
->symbol_tree
);
421 pnode
= rb_prev(&sym
->node
);
423 entry
= &rb_entry(pnode
, struct symbol
, node
)->list
;
425 entry
= &sym
->sec
->symbol_list
;
426 list_add(&sym
->list
, entry
);
427 elf_hash_add(symbol
, &sym
->hash
, sym
->idx
);
428 elf_hash_add(symbol_name
, &sym
->name_hash
, str_hash(sym
->name
));
431 * Don't store empty STT_NOTYPE symbols in the rbtree. They
432 * can exist within a function, confusing the sorting.
435 __sym_remove(sym
, &sym
->sec
->symbol_tree
);
438 static int read_symbols(struct elf
*elf
)
440 struct section
*symtab
, *symtab_shndx
, *sec
;
441 struct symbol
*sym
, *pfunc
;
444 Elf_Data
*shndx_data
= NULL
;
447 symtab
= find_section_by_name(elf
, ".symtab");
449 symtab_shndx
= find_section_by_name(elf
, ".symtab_shndx");
451 shndx_data
= symtab_shndx
->data
;
453 symbols_nr
= sec_num_entries(symtab
);
456 * A missing symbol table is actually possible if it's an empty
457 * .o file. This can happen for thunk_64.o. Make sure to at
458 * least allocate the symbol hash tables so we can do symbol
459 * lookups without crashing.
464 if (!elf_alloc_hash(symbol
, symbols_nr
) ||
465 !elf_alloc_hash(symbol_name
, symbols_nr
))
468 elf
->symbol_data
= calloc(symbols_nr
, sizeof(*sym
));
469 if (!elf
->symbol_data
) {
473 for (i
= 0; i
< symbols_nr
; i
++) {
474 sym
= &elf
->symbol_data
[i
];
478 if (!gelf_getsymshndx(symtab
->data
, shndx_data
, i
, &sym
->sym
,
480 WARN_ELF("gelf_getsymshndx");
484 sym
->name
= elf_strptr(elf
->elf
, symtab
->sh
.sh_link
,
487 WARN_ELF("elf_strptr");
491 if ((sym
->sym
.st_shndx
> SHN_UNDEF
&&
492 sym
->sym
.st_shndx
< SHN_LORESERVE
) ||
493 (shndx_data
&& sym
->sym
.st_shndx
== SHN_XINDEX
)) {
494 if (sym
->sym
.st_shndx
!= SHN_XINDEX
)
495 shndx
= sym
->sym
.st_shndx
;
497 sym
->sec
= find_section_by_index(elf
, shndx
);
499 WARN("couldn't find section for symbol %s",
503 if (GELF_ST_TYPE(sym
->sym
.st_info
) == STT_SECTION
) {
504 sym
->name
= sym
->sec
->name
;
508 sym
->sec
= find_section_by_index(elf
, 0);
510 elf_add_symbol(elf
, sym
);
514 printf("nr_symbols: %lu\n", (unsigned long)symbols_nr
);
515 printf("symbol_bits: %d\n", elf
->symbol_bits
);
518 /* Create parent/child links for any cold subfunctions */
519 list_for_each_entry(sec
, &elf
->sections
, list
) {
520 sec_for_each_sym(sec
, sym
) {
523 if (sym
->type
!= STT_FUNC
)
526 if (sym
->pfunc
== NULL
)
529 if (sym
->cfunc
== NULL
)
532 coldstr
= strstr(sym
->name
, ".cold");
536 pnamelen
= coldstr
- sym
->name
;
537 pname
= strndup(sym
->name
, pnamelen
);
539 WARN("%s(): failed to allocate memory",
544 pfunc
= find_symbol_by_name(elf
, pname
);
548 WARN("%s(): can't find parent function",
557 * Unfortunately, -fnoreorder-functions puts the child
558 * inside the parent. Remove the overlap so we can
559 * have sane assumptions.
561 * Note that pfunc->len now no longer matches
562 * pfunc->sym.st_size.
564 if (sym
->sec
== pfunc
->sec
&&
565 sym
->offset
>= pfunc
->offset
&&
566 sym
->offset
+ sym
->len
== pfunc
->offset
+ pfunc
->len
) {
567 pfunc
->len
-= sym
->len
;
580 * @sym's idx has changed. Update the relocs which reference it.
582 static int elf_update_sym_relocs(struct elf
*elf
, struct symbol
*sym
)
586 for (reloc
= sym
->relocs
; reloc
; reloc
= reloc
->sym_next_reloc
)
587 set_reloc_sym(elf
, reloc
, reloc
->sym
->idx
);
593 * The libelf API is terrible; gelf_update_sym*() takes a data block relative
594 * index value, *NOT* the symbol index. As such, iterate the data blocks and
595 * adjust index until it fits.
597 * If no data block is found, allow adding a new data block provided the index
598 * is only one past the end.
600 static int elf_update_symbol(struct elf
*elf
, struct section
*symtab
,
601 struct section
*symtab_shndx
, struct symbol
*sym
)
603 Elf32_Word shndx
= sym
->sec
? sym
->sec
->idx
: SHN_UNDEF
;
604 Elf_Data
*symtab_data
= NULL
, *shndx_data
= NULL
;
605 Elf64_Xword entsize
= symtab
->sh
.sh_entsize
;
606 int max_idx
, idx
= sym
->idx
;
607 Elf_Scn
*s
, *t
= NULL
;
608 bool is_special_shndx
= sym
->sym
.st_shndx
>= SHN_LORESERVE
&&
609 sym
->sym
.st_shndx
!= SHN_XINDEX
;
611 if (is_special_shndx
)
612 shndx
= sym
->sym
.st_shndx
;
614 s
= elf_getscn(elf
->elf
, symtab
->idx
);
616 WARN_ELF("elf_getscn");
621 t
= elf_getscn(elf
->elf
, symtab_shndx
->idx
);
623 WARN_ELF("elf_getscn");
629 /* get next data descriptor for the relevant sections */
630 symtab_data
= elf_getdata(s
, symtab_data
);
632 shndx_data
= elf_getdata(t
, shndx_data
);
637 * Over-allocate to avoid O(n^2) symbol creation
638 * behaviour. The down side is that libelf doesn't
639 * like this; see elf_truncate_section() for the fixup.
641 int num
= max(1U, sym
->idx
/3);
645 /* we don't do holes in symbol tables */
646 WARN("index out of range");
650 /* if @idx == 0, it's the next contiguous entry, create it */
651 symtab_data
= elf_newdata(s
);
653 shndx_data
= elf_newdata(t
);
655 buf
= calloc(num
, entsize
);
661 symtab_data
->d_buf
= buf
;
662 symtab_data
->d_size
= num
* entsize
;
663 symtab_data
->d_align
= 1;
664 symtab_data
->d_type
= ELF_T_SYM
;
666 mark_sec_changed(elf
, symtab
, true);
667 symtab
->truncate
= true;
670 buf
= calloc(num
, sizeof(Elf32_Word
));
676 shndx_data
->d_buf
= buf
;
677 shndx_data
->d_size
= num
* sizeof(Elf32_Word
);
678 shndx_data
->d_align
= sizeof(Elf32_Word
);
679 shndx_data
->d_type
= ELF_T_WORD
;
681 mark_sec_changed(elf
, symtab_shndx
, true);
682 symtab_shndx
->truncate
= true;
688 /* empty blocks should not happen */
689 if (!symtab_data
->d_size
) {
690 WARN("zero size data");
694 /* is this the right block? */
695 max_idx
= symtab_data
->d_size
/ entsize
;
699 /* adjust index and try again */
703 /* something went side-ways */
705 WARN("negative index");
709 /* setup extended section index magic and write the symbol */
710 if ((shndx
>= SHN_UNDEF
&& shndx
< SHN_LORESERVE
) || is_special_shndx
) {
711 sym
->sym
.st_shndx
= shndx
;
715 sym
->sym
.st_shndx
= SHN_XINDEX
;
717 WARN("no .symtab_shndx");
722 if (!gelf_update_symshndx(symtab_data
, shndx_data
, idx
, &sym
->sym
, shndx
)) {
723 WARN_ELF("gelf_update_symshndx");
730 static struct symbol
*
731 __elf_create_symbol(struct elf
*elf
, struct symbol
*sym
)
733 struct section
*symtab
, *symtab_shndx
;
734 Elf32_Word first_non_local
, new_idx
;
737 symtab
= find_section_by_name(elf
, ".symtab");
739 symtab_shndx
= find_section_by_name(elf
, ".symtab_shndx");
745 new_idx
= sec_num_entries(symtab
);
747 if (GELF_ST_BIND(sym
->sym
.st_info
) != STB_LOCAL
)
751 * Move the first global symbol, as per sh_info, into a new, higher
752 * symbol index. This fees up a spot for a new local symbol.
754 first_non_local
= symtab
->sh
.sh_info
;
755 old
= find_symbol_by_index(elf
, first_non_local
);
758 elf_hash_del(symbol
, &old
->hash
, old
->idx
);
759 elf_hash_add(symbol
, &old
->hash
, new_idx
);
762 if (elf_update_symbol(elf
, symtab
, symtab_shndx
, old
)) {
763 WARN("elf_update_symbol move");
767 if (elf_update_sym_relocs(elf
, old
))
770 new_idx
= first_non_local
;
774 * Either way, we will add a LOCAL symbol.
776 symtab
->sh
.sh_info
+= 1;
780 if (elf_update_symbol(elf
, symtab
, symtab_shndx
, sym
)) {
781 WARN("elf_update_symbol");
785 symtab
->sh
.sh_size
+= symtab
->sh
.sh_entsize
;
786 mark_sec_changed(elf
, symtab
, true);
789 symtab_shndx
->sh
.sh_size
+= sizeof(Elf32_Word
);
790 mark_sec_changed(elf
, symtab_shndx
, true);
796 static struct symbol
*
797 elf_create_section_symbol(struct elf
*elf
, struct section
*sec
)
799 struct symbol
*sym
= calloc(1, sizeof(*sym
));
806 sym
->name
= sec
->name
;
810 sym
->sym
.st_info
= GELF_ST_INFO(STB_LOCAL
, STT_SECTION
);
815 sym
= __elf_create_symbol(elf
, sym
);
817 elf_add_symbol(elf
, sym
);
822 static int elf_add_string(struct elf
*elf
, struct section
*strtab
, char *str
);
825 elf_create_prefix_symbol(struct elf
*elf
, struct symbol
*orig
, long size
)
827 struct symbol
*sym
= calloc(1, sizeof(*sym
));
828 size_t namelen
= strlen(orig
->name
) + sizeof("__pfx_");
829 char *name
= malloc(namelen
);
836 snprintf(name
, namelen
, "__pfx_%s", orig
->name
);
839 sym
->sec
= orig
->sec
;
841 sym
->sym
.st_name
= elf_add_string(elf
, NULL
, name
);
842 sym
->sym
.st_info
= orig
->sym
.st_info
;
843 sym
->sym
.st_value
= orig
->sym
.st_value
- size
;
844 sym
->sym
.st_size
= size
;
846 sym
= __elf_create_symbol(elf
, sym
);
848 elf_add_symbol(elf
, sym
);
853 static struct reloc
*elf_init_reloc(struct elf
*elf
, struct section
*rsec
,
854 unsigned int reloc_idx
,
855 unsigned long offset
, struct symbol
*sym
,
856 s64 addend
, unsigned int type
)
858 struct reloc
*reloc
, empty
= { 0 };
860 if (reloc_idx
>= sec_num_entries(rsec
)) {
861 WARN("%s: bad reloc_idx %u for %s with %d relocs",
862 __func__
, reloc_idx
, rsec
->name
, sec_num_entries(rsec
));
866 reloc
= &rsec
->relocs
[reloc_idx
];
868 if (memcmp(reloc
, &empty
, sizeof(empty
))) {
869 WARN("%s: %s: reloc %d already initialized!",
870 __func__
, rsec
->name
, reloc_idx
);
877 set_reloc_offset(elf
, reloc
, offset
);
878 set_reloc_sym(elf
, reloc
, sym
->idx
);
879 set_reloc_type(elf
, reloc
, type
);
880 set_reloc_addend(elf
, reloc
, addend
);
882 elf_hash_add(reloc
, &reloc
->hash
, reloc_hash(reloc
));
883 reloc
->sym_next_reloc
= sym
->relocs
;
889 struct reloc
*elf_init_reloc_text_sym(struct elf
*elf
, struct section
*sec
,
890 unsigned long offset
,
891 unsigned int reloc_idx
,
892 struct section
*insn_sec
,
893 unsigned long insn_off
)
895 struct symbol
*sym
= insn_sec
->sym
;
896 int addend
= insn_off
;
898 if (!(insn_sec
->sh
.sh_flags
& SHF_EXECINSTR
)) {
899 WARN("bad call to %s() for data symbol %s",
900 __func__
, sym
->name
);
906 * Due to how weak functions work, we must use section based
907 * relocations. Symbol based relocations would result in the
908 * weak and non-weak function annotations being overlaid on the
909 * non-weak function after linking.
911 sym
= elf_create_section_symbol(elf
, insn_sec
);
918 return elf_init_reloc(elf
, sec
->rsec
, reloc_idx
, offset
, sym
, addend
,
919 elf_text_rela_type(elf
));
922 struct reloc
*elf_init_reloc_data_sym(struct elf
*elf
, struct section
*sec
,
923 unsigned long offset
,
924 unsigned int reloc_idx
,
928 if (sym
->sec
&& (sec
->sh
.sh_flags
& SHF_EXECINSTR
)) {
929 WARN("bad call to %s() for text symbol %s",
930 __func__
, sym
->name
);
934 return elf_init_reloc(elf
, sec
->rsec
, reloc_idx
, offset
, sym
, addend
,
935 elf_data_rela_type(elf
));
938 static int read_relocs(struct elf
*elf
)
940 unsigned long nr_reloc
, max_reloc
= 0;
941 struct section
*rsec
;
947 if (!elf_alloc_hash(reloc
, elf
->num_relocs
))
950 list_for_each_entry(rsec
, &elf
->sections
, list
) {
951 if (!is_reloc_sec(rsec
))
954 rsec
->base
= find_section_by_index(elf
, rsec
->sh
.sh_info
);
956 WARN("can't find base section for reloc section %s",
961 rsec
->base
->rsec
= rsec
;
964 rsec
->relocs
= calloc(sec_num_entries(rsec
), sizeof(*reloc
));
969 for (i
= 0; i
< sec_num_entries(rsec
); i
++) {
970 reloc
= &rsec
->relocs
[i
];
973 symndx
= reloc_sym(reloc
);
974 reloc
->sym
= sym
= find_symbol_by_index(elf
, symndx
);
976 WARN("can't find reloc entry symbol %d for %s",
981 elf_hash_add(reloc
, &reloc
->hash
, reloc_hash(reloc
));
982 reloc
->sym_next_reloc
= sym
->relocs
;
987 max_reloc
= max(max_reloc
, nr_reloc
);
991 printf("max_reloc: %lu\n", max_reloc
);
992 printf("num_relocs: %lu\n", elf
->num_relocs
);
993 printf("reloc_bits: %d\n", elf
->reloc_bits
);
999 struct elf
*elf_open_read(const char *name
, int flags
)
1004 elf_version(EV_CURRENT
);
1006 elf
= malloc(sizeof(*elf
));
1011 memset(elf
, 0, sizeof(*elf
));
1013 INIT_LIST_HEAD(&elf
->sections
);
1015 elf
->fd
= open(name
, flags
);
1016 if (elf
->fd
== -1) {
1017 fprintf(stderr
, "objtool: Can't open '%s': %s\n",
1018 name
, strerror(errno
));
1022 if ((flags
& O_ACCMODE
) == O_RDONLY
)
1023 cmd
= ELF_C_READ_MMAP
;
1024 else if ((flags
& O_ACCMODE
) == O_RDWR
)
1029 elf
->elf
= elf_begin(elf
->fd
, cmd
, NULL
);
1031 WARN_ELF("elf_begin");
1035 if (!gelf_getehdr(elf
->elf
, &elf
->ehdr
)) {
1036 WARN_ELF("gelf_getehdr");
1040 if (read_sections(elf
))
1043 if (read_symbols(elf
))
1046 if (read_relocs(elf
))
1056 static int elf_add_string(struct elf
*elf
, struct section
*strtab
, char *str
)
1063 strtab
= find_section_by_name(elf
, ".strtab");
1065 WARN("can't find .strtab section");
1069 s
= elf_getscn(elf
->elf
, strtab
->idx
);
1071 WARN_ELF("elf_getscn");
1075 data
= elf_newdata(s
);
1077 WARN_ELF("elf_newdata");
1082 data
->d_size
= strlen(str
) + 1;
1085 len
= strtab
->sh
.sh_size
;
1086 strtab
->sh
.sh_size
+= data
->d_size
;
1088 mark_sec_changed(elf
, strtab
, true);
1093 struct section
*elf_create_section(struct elf
*elf
, const char *name
,
1094 size_t entsize
, unsigned int nr
)
1096 struct section
*sec
, *shstrtab
;
1097 size_t size
= entsize
* nr
;
1100 sec
= malloc(sizeof(*sec
));
1105 memset(sec
, 0, sizeof(*sec
));
1107 INIT_LIST_HEAD(&sec
->symbol_list
);
1109 s
= elf_newscn(elf
->elf
);
1111 WARN_ELF("elf_newscn");
1115 sec
->name
= strdup(name
);
1121 sec
->idx
= elf_ndxscn(s
);
1123 sec
->data
= elf_newdata(s
);
1125 WARN_ELF("elf_newdata");
1129 sec
->data
->d_size
= size
;
1130 sec
->data
->d_align
= 1;
1133 sec
->data
->d_buf
= malloc(size
);
1134 if (!sec
->data
->d_buf
) {
1138 memset(sec
->data
->d_buf
, 0, size
);
1141 if (!gelf_getshdr(s
, &sec
->sh
)) {
1142 WARN_ELF("gelf_getshdr");
1146 sec
->sh
.sh_size
= size
;
1147 sec
->sh
.sh_entsize
= entsize
;
1148 sec
->sh
.sh_type
= SHT_PROGBITS
;
1149 sec
->sh
.sh_addralign
= 1;
1150 sec
->sh
.sh_flags
= SHF_ALLOC
;
1152 /* Add section name to .shstrtab (or .strtab for Clang) */
1153 shstrtab
= find_section_by_name(elf
, ".shstrtab");
1155 shstrtab
= find_section_by_name(elf
, ".strtab");
1157 WARN("can't find .shstrtab or .strtab section");
1160 sec
->sh
.sh_name
= elf_add_string(elf
, shstrtab
, sec
->name
);
1161 if (sec
->sh
.sh_name
== -1)
1164 list_add_tail(&sec
->list
, &elf
->sections
);
1165 elf_hash_add(section
, &sec
->hash
, sec
->idx
);
1166 elf_hash_add(section_name
, &sec
->name_hash
, str_hash(sec
->name
));
1168 mark_sec_changed(elf
, sec
, true);
1173 static struct section
*elf_create_rela_section(struct elf
*elf
,
1174 struct section
*sec
,
1175 unsigned int reloc_nr
)
1177 struct section
*rsec
;
1180 rsec_name
= malloc(strlen(sec
->name
) + strlen(".rela") + 1);
1185 strcpy(rsec_name
, ".rela");
1186 strcat(rsec_name
, sec
->name
);
1188 rsec
= elf_create_section(elf
, rsec_name
, elf_rela_size(elf
), reloc_nr
);
1193 rsec
->data
->d_type
= ELF_T_RELA
;
1194 rsec
->sh
.sh_type
= SHT_RELA
;
1195 rsec
->sh
.sh_addralign
= elf_addr_size(elf
);
1196 rsec
->sh
.sh_link
= find_section_by_name(elf
, ".symtab")->idx
;
1197 rsec
->sh
.sh_info
= sec
->idx
;
1198 rsec
->sh
.sh_flags
= SHF_INFO_LINK
;
1200 rsec
->relocs
= calloc(sec_num_entries(rsec
), sizeof(struct reloc
));
1201 if (!rsec
->relocs
) {
1212 struct section
*elf_create_section_pair(struct elf
*elf
, const char *name
,
1213 size_t entsize
, unsigned int nr
,
1214 unsigned int reloc_nr
)
1216 struct section
*sec
;
1218 sec
= elf_create_section(elf
, name
, entsize
, nr
);
1222 if (!elf_create_rela_section(elf
, sec
, reloc_nr
))
1228 int elf_write_insn(struct elf
*elf
, struct section
*sec
,
1229 unsigned long offset
, unsigned int len
,
1232 Elf_Data
*data
= sec
->data
;
1234 if (data
->d_type
!= ELF_T_BYTE
|| data
->d_off
) {
1235 WARN("write to unexpected data for section: %s", sec
->name
);
1239 memcpy(data
->d_buf
+ offset
, insn
, len
);
1241 mark_sec_changed(elf
, sec
, true);
1247 * When Elf_Scn::sh_size is smaller than the combined Elf_Data::d_size
1250 * A) adhere to the section header and truncate the data, or
1251 * B) ignore the section header and write out all the data you've got?
1253 * Yes, libelf sucks and we need to manually truncate if we over-allocate data.
1255 static int elf_truncate_section(struct elf
*elf
, struct section
*sec
)
1257 u64 size
= sec
->sh
.sh_size
;
1258 bool truncated
= false;
1259 Elf_Data
*data
= NULL
;
1262 s
= elf_getscn(elf
->elf
, sec
->idx
);
1264 WARN_ELF("elf_getscn");
1269 /* get next data descriptor for the relevant section */
1270 data
= elf_getdata(s
, data
);
1274 WARN("end of section data but non-zero size left\n");
1281 /* when we remove symbols */
1282 WARN("truncated; but more data\n");
1286 if (!data
->d_size
) {
1287 WARN("zero size data");
1291 if (data
->d_size
> size
) {
1293 data
->d_size
= size
;
1296 size
-= data
->d_size
;
1300 int elf_write(struct elf
*elf
)
1302 struct section
*sec
;
1308 /* Update changed relocation sections and section headers: */
1309 list_for_each_entry(sec
, &elf
->sections
, list
) {
1311 elf_truncate_section(elf
, sec
);
1313 if (sec_changed(sec
)) {
1314 s
= elf_getscn(elf
->elf
, sec
->idx
);
1316 WARN_ELF("elf_getscn");
1320 /* Note this also flags the section dirty */
1321 if (!gelf_update_shdr(s
, &sec
->sh
)) {
1322 WARN_ELF("gelf_update_shdr");
1326 mark_sec_changed(elf
, sec
, false);
1330 /* Make sure the new section header entries get updated properly. */
1331 elf_flagelf(elf
->elf
, ELF_C_SET
, ELF_F_DIRTY
);
1333 /* Write all changes to the file. */
1334 if (elf_update(elf
->elf
, ELF_C_WRITE
) < 0) {
1335 WARN_ELF("elf_update");
1339 elf
->changed
= false;
1344 void elf_close(struct elf
*elf
)
1353 * NOTE: All remaining allocations are leaked on purpose. Objtool is
1354 * about to exit anyway.