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
> 

Reply via email to