Re: [PATCH] modpost: Get proper section index by get_secindex() instead of st_shndx

From: Xiao Yang
Date: Wed Mar 18 2020 - 06:08:59 EST


On 2020/3/18 17:49, Masahiro Yamada wrote:
On Tue, Mar 17, 2020 at 10:05 AM Xiao Yang<yangx.jy@xxxxxxxxxxxxxx> wrote:

On 2020/3/16 20:28, Xiao Yang wrote:

Thanks for catching this bug.


(uint16_t) st_shndx is limited to 65535(i.e. SHN_XINDEX) so sym_get_data() gets
wrong section index by st_shndx if object file(e.g. vmlinux.o) has more than
Hi,

It seems better to say that sym_get_data() gets wrong section index by
st_shndx if requested symbol contains extended section index that is
more than 65535.


Sounds good to me.


Thanks,
Xiao Yang
65535 sessions. In this case, we need to get proper section index by .symtab_shndx
section.

Module.symvers generated by building kernel with "-ffunction-sections -fdata-sections"
shows the issue(i.e. cannot get 89902 by st_shndx):
-------------------------------------------------------------------
[root@Fedora-30 linux]# file Module.symvers
Module.symvers: data
[root@Fedora-30 linux]# head -n1 Module.symvers
0x5caf3011 ipv6_chk_custom_prefix ââââââââ vmlinux EXPORT_SYMBOL


Could you delete this dump?
I'd like to avoid garbling where possible.

Hi Masahiro,

Sure, it is OK to delete it.


...
[root@Fedora-30 linux]# readelf -s -W vmlinux.o | grep __kstrtabns_ipv6_chk_custom_prefix
199174: 0000000000032578 1 OBJECT LOCAL DEFAULT 89902 __kstrtabns_ipv6_chk_custom_prefix
[root@Fedora-30 linux]# readelf -S -W vmlinux.o | grep 89902
[89902] __ksymtab_strings PROGBITS 0000000000000000 a94e00 0345a2 00 A 0 0 1
-------------------------------------------------------------------

Fixes: afa0459daa7b ("modpost: add a helper to get data pointed by a symbol")

Strictly speaking, this commit does not introduce any bug.

The CRC bug for MODVERSIONS exists since
56067812d5b0 ("kbuild: modversions: add infrastructure for emitting
relative CRCs")


Will replace it with your suggested commit.


Fixes: 5545322c86d9 ("modpost: refactor namespace_from_kstrtabns() to not hard-code section name")

This commit hash is wrong.
The correct one is

Fixes: e84f9fbbece1 ("modpost: refactor namespace_from_kstrtabns() to
not hard-code section name")



Sorry for the wrong commit hash.

Thanks a lot for your quick review.
I will send v2 patch soon.

Best Regards,
Xiao Yang




Signed-off-by: Xiao Yang<yangx.jy@xxxxxxxxxxxxxx>
---
scripts/mod/modpost.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index d9418c58a8c0..c1fec8cac257 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -310,7 +310,8 @@ static const char *sec_name(struct elf_info *elf, int secindex)

static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
{
- Elf_Shdr *sechdr =&info->sechdrs[sym->st_shndx];
+ unsigned int secindex = get_secindex(info, sym);
+ Elf_Shdr *sechdr =&info->sechdrs[secindex];
unsigned long offset;

offset = sym->st_value;





--
Best Regards
Masahiro Yamada


.