On Wed, Apr 22, 2026 at 09:03:33PM -0700, Josh Poimboeuf wrote: > Move the sec->rodata marking from check.c to elf.c so it's set during > ELF reading rather than during the check pipeline. This makes the > rodata flag available to all objtool users, including klp-diff which > reads ELF files directly without running check(). > > Add an is_rodata_sec() helper to elf.h for consistency with > is_text_sec() and is_string_sec(). > > Signed-off-by: Josh Poimboeuf <[email protected]>
Acked-by: Peter Zijlstra (Intel) <[email protected]> > --- > tools/objtool/check.c | 11 +++-------- > tools/objtool/elf.c | 13 +++++++++++++ > tools/objtool/include/objtool/elf.h | 5 +++++ > 3 files changed, 21 insertions(+), 8 deletions(-) > > diff --git a/tools/objtool/check.c b/tools/objtool/check.c > index 9b11cf3193b9..5722d4568401 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -2566,7 +2566,6 @@ static int classify_symbols(struct objtool_file *file) > static void mark_rodata(struct objtool_file *file) > { > struct section *sec; > - bool found = false; > > /* > * Search for the following rodata sections, each of which can > @@ -2579,15 +2578,11 @@ static void mark_rodata(struct objtool_file *file) > * .rodata.str1.* sections are ignored; they don't contain jump tables. > */ > for_each_sec(file->elf, sec) { > - if ((!strncmp(sec->name, ".rodata", 7) && > - !strstr(sec->name, ".str1.")) || > - !strncmp(sec->name, ".data.rel.ro", 12)) { > - sec->rodata = true; > - found = true; > + if (is_rodata_sec(sec)) { > + file->rodata = true; > + return; > } > } > - > - file->rodata = found; > } > > static void mark_holes(struct objtool_file *file) > diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c > index f3df2bde119f..ac9da81a7a2f 100644 > --- a/tools/objtool/elf.c > +++ b/tools/objtool/elf.c > @@ -1172,6 +1172,17 @@ static int read_relocs(struct elf *elf) > return 0; > } > > +static void mark_rodata(struct elf *elf) > +{ > + struct section *sec; > + > + for_each_sec(elf, sec) { > + if ((strstarts(sec->name, ".rodata") && !strstr(sec->name, > ".str1.")) || > + strstarts(sec->name, ".data.rel.ro")) > + sec->rodata = true; > + } > +} > + > struct elf *elf_open_read(const char *name, int flags) > { > struct elf *elf; > @@ -1222,6 +1233,8 @@ struct elf *elf_open_read(const char *name, int flags) > if (read_sections(elf)) > goto err; > > + mark_rodata(elf); > + > if (read_symbols(elf)) > goto err; > > diff --git a/tools/objtool/include/objtool/elf.h > b/tools/objtool/include/objtool/elf.h > index 25573e5af76e..c61bd57767f9 100644 > --- a/tools/objtool/include/objtool/elf.h > +++ b/tools/objtool/include/objtool/elf.h > @@ -296,6 +296,11 @@ static inline bool is_text_sec(struct section *sec) > return sec->sh.sh_flags & SHF_EXECINSTR; > } > > +static inline bool is_rodata_sec(struct section *sec) > +{ > + return sec->rodata; > +} > + > static inline bool sec_changed(struct section *sec) > { > return sec->_changed; > -- > 2.53.0 >

