From: Youling Tang <tangyouling@loongson.cn>
To: Hengqi Chen <hengqi.chen@gmail.com>
Cc: elfutils-devel@sourceware.org, Liwei Ge <geliwei@openanolis.org>
Subject: Re: [PATCH] backends: add checks for _GLOBAL_OFFSET_TABLE_ on loongarch
Date: Thu, 6 Apr 2023 09:59:00 +0800 [thread overview]
Message-ID: <209c35af-c62e-4232-d08d-bf807009351e@loongson.cn> (raw)
In-Reply-To: <CAEyhmHT_WXTqx8Fjjd4g_hW2AuHeeV-OQJ9_4TGT5v_CAg6hZw@mail.gmail.com>
Hi, Hengqi
On 04/04/2023 11:45 PM, Hengqi Chen wrote:
> Hi, Youling
>
> On Sat, Apr 1, 2023 at 11:19 AM Youling Tang <tangyouling@loongson.cn> wrote:
>>
>> Add handling of _GLOBAL_OFFSET_TABLE_.
>>
>> Before applying the patch:
>> $ ./src/elflint --gnu-ld ./src/elflint
>> section [35] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol value 0x68548
>> does not match .got.plt section address 0x68238
>>
>> After applying the patch:
>> $ ./src/elflint --gnu-ld ./src/elflint
>> No errors
>>
>> Signed-off-by: Liwei Ge <geliwei@openanolis.org>
>> Signed-off-by: Youling Tang <tangyouling@loongson.cn>
>> ---
>> backends/ChangeLog | 4 ++++
>> backends/loongarch_init.c | 1 +
>> backends/loongarch_symbol.c | 35 +++++++++++++++++++++++++++++++++++
>> 3 files changed, 40 insertions(+)
>>
>> diff --git a/backends/ChangeLog b/backends/ChangeLog
>> index 81f08314..41071953 100644
>> --- a/backends/ChangeLog
>> +++ b/backends/ChangeLog
>> @@ -1,3 +1,7 @@
>> +2023-04-01 Youling Tang <tangyouling@loongson.cn>
>> + * loongarch_init.c (loongarch_init): Hook check_special_symbol.
>> + * loongarch_symbol.c (loongarch_check_special_symbol): New function.
>> +
>> 2023-02-07 Mark Wielaard <mark@klomp.org>
>>
>> * libebl_CPU.h (dwarf_peeled_die_type): Explicitly handle
>> diff --git a/backends/loongarch_init.c b/backends/loongarch_init.c
>> index 59d8cc3d..b641b07f 100644
>> --- a/backends/loongarch_init.c
>> +++ b/backends/loongarch_init.c
>> @@ -46,6 +46,7 @@ loongarch_init (Elf *elf __attribute__ ((unused)),
>> loongarch_init_reloc (eh);
>> HOOK (eh, reloc_simple_type);
>> HOOK (eh, machine_flag_check);
>> + HOOK (eh, check_special_symbol);
>>
>> return eh;
>> }
>> diff --git a/backends/loongarch_symbol.c b/backends/loongarch_symbol.c
>> index 43306ab8..5ce55bad 100644
>> --- a/backends/loongarch_symbol.c
>> +++ b/backends/loongarch_symbol.c
>> @@ -79,3 +79,38 @@ loongarch_machine_flag_check (GElf_Word flags)
>> return ((flags &~ (EF_LARCH_ABI_MODIFIER_MASK
>> | EF_LARCH_OBJABI_V1)) == 0);
>> }
>> +
>> +/* Check whether given symbol's st_value and st_size are OK despite failing
>> + normal checks. */
>> +bool
>> +loongarch_check_special_symbol (Elf *elf, const GElf_Sym *sym,
>> + const char *name, const GElf_Shdr *destshdr)
>> +{
>> + if (name != NULL
>> + && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
>> + {
>> + size_t shstrndx;
>> + if (elf_getshdrstrndx (elf, &shstrndx) != 0)
>> + return false;
>> + const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
>> + if (sname != NULL
>> + && (strcmp (sname, ".got") == 0 || strcmp (sname, ".got.plt") == 0))
>> + {
>> + Elf_Scn *scn = NULL;
>> + while ((scn = elf_nextscn (elf, scn)) != NULL)
>> + {
>> + GElf_Shdr shdr_mem;
>> + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
>> + if (shdr != NULL)
>> + {
>> + sname = elf_strptr (elf, shstrndx, shdr->sh_name);
>> + if (sname != NULL && strcmp (sname, ".got") == 0)
>> + return (sym->st_value >= shdr->sh_addr
>> + && sym->st_value < shdr->sh_addr + shdr->sh_size);
>> + }
>> + }
>> + }
>> + }
>> +
>> + return false;
>> +}
>> --
>> 2.37.1
>>
>
> I've tested this locally, but still remains one error:
> section [34] '.symtab': _DYNAMIC symbol size 0 does not match dynamic
> segment size 480
The problem should be independent of this patch, but I can't reproduce
it.
- Test Environment 1: Old Toolchain:
$ cat /etc/os-release
NAME="My GNU/Linux System for LoongArch64"
VERSION="5.0"
ID=CLFS4LA64
PRETTY_NAME="My GNU/Linux System for LoongArch64 5.0"
$ gcc -v
gcc version 12.1.0 (GCC)
$ ./src/elflint --gnu-ld ./src/elflint
No errors
- Test Environment 2: New Toolchain:
$ cat /etc/os-release
NAME="My GNU/Linux System for LoongArch64"
VERSION="6.0"
ID=CLFS4LA64
PRETTY_NAME="My GNU/Linux System for LoongArch64 6.0"
$ gcc -v
gcc version 13.0.0 20220919 (experimental) (GCC)
$ ./src/elflint --gnu-ld ./src/elflint
No errors
Can you provide your test environment, or help debug the possible
causes of the problem?
Thanks,
Youling.
next prev parent reply other threads:[~2023-04-06 1:59 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-01 3:18 Youling Tang
2023-04-04 15:45 ` Hengqi Chen
2023-04-06 1:59 ` Youling Tang [this message]
2023-04-06 22:52 ` Mark Wielaard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=209c35af-c62e-4232-d08d-bf807009351e@loongson.cn \
--to=tangyouling@loongson.cn \
--cc=elfutils-devel@sourceware.org \
--cc=geliwei@openanolis.org \
--cc=hengqi.chen@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).