From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B6792577 for ; Mon, 16 May 2022 22:48:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BE8A5C385B8; Mon, 16 May 2022 22:48:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1652741337; bh=0a/C5Zh/EyYXf/vzC/E/LwVLfqbJzBzn8Mkz0TSW/yQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=tWnzV72+IpwctV6Br6FbM1QcIOfi5j/S+mo0+UkMggtP03es0EHoIIM8FXr80ydlN pU/iMMX7IiiFYYkMPykUzjkQ/rBELVMBM3ZgczPG+Df+Xf4JvmqeWRpnaplIQXADV3 ljdR/DzH36ziJ14mg/fQgOQZwpA3aKGJuMytrgVFUjcupuZ8L8ly4T0fUGHclcClJC uPWzkwAkQXg19m1TXk/9yigHK8Xi9f+zd5bIi2u4bEOR6QyRG/pF3pV/l72MQ1UwKC eHOfs3Jli4RLCkx7MhuwaX9PwWg82TqD6ZK3Q3XRji8jma+x6Jbeey+zHX9LgHn+r2 xIr0STsCpLCAA== Date: Mon, 16 May 2022 15:48:55 -0700 From: Nathan Chancellor To: Peter Zijlstra Cc: Josh Poimboeuf , Nick Desaulniers , llvm@lists.linux.dev, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com Subject: Re: objtool "no non-local symbols" error with tip of tree LLVM Message-ID: References: <20220516214005.GQ76023@worktop.programming.kicks-ass.net> Precedence: bulk X-Mailing-List: llvm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220516214005.GQ76023@worktop.programming.kicks-ass.net> On Mon, May 16, 2022 at 11:40:05PM +0200, Peter Zijlstra wrote: > On Mon, May 16, 2022 at 01:47:15PM -0700, Nathan Chancellor wrote: > > Hi Josh and Peter, > > > > After a recent change in LLVM [1], I see warnings (errors?) from objtool > > when building x86_64 allmodconfig on 5.15 and 5.17: > > > > $ make -skj"$(nproc)" KCONFIG_ALLCONFIG=<(echo CONFIG_WERROR) LLVM=1 allmodconfig all > > ... > > mm/highmem.o: warning: objtool: no non-local symbols !? > > mm/highmem.o: warning: objtool: gelf_update_symshndx: invalid section index > > make[2]: *** [scripts/Makefile.build:288: mm/highmem.o] Error 255 > > ... > > security/tomoyo/load_policy.o: warning: objtool: no non-local symbols !? > > security/tomoyo/load_policy.o: warning: objtool: gelf_update_symshndx: invalid section index > > make[3]: *** [scripts/Makefile.build:288: security/tomoyo/load_policy.o] Error 255 > > ... > > > > I don't see the same errors on x86_64 allmodconfig on mainline so I > > bisected the 5.17 branch and came upon commit 4abff6d48dbc ("objtool: > > Fix code relocs vs weak symbols"). I wanted to see what 5.17 might be > > missing and came to commit ed53a0d97192 ("x86/alternative: Use > > .ibt_endbr_seal to seal indirect calls") in mainline, which I think just > > hides the issue for allmodconfig. I can reproduce this problem with a > > more selective set of config values on mainline: > > > > $ make -skj"$(nproc)" LLVM=1 defconfig > > > > $ scripts/config -e KASAN -e SECURITY_TOMOYO -e SECURITY_TOMOYO_OMIT_USERSPACE_LOADER > > > > $ make -skj"$(nproc)" LLVM=1 olddefconfig security/tomoyo/load_policy.o > > security/tomoyo/load_policy.o: warning: objtool: no non-local symbols !? > > security/tomoyo/load_policy.o: warning: objtool: gelf_update_symshndx: invalid section index > > make[3]: *** [scripts/Makefile.build:288: security/tomoyo/load_policy.o] Error 255 > > ... > > > > Looking at the object file, the '.text.asan.module_ctor' section has > > disappeared. > > > > Before: > > > > $ llvm-nm -S security/tomoyo/load_policy.o > > 0000000000000000 0000000000000001 t asan.module_ctor > > > > $ llvm-readelf -s security/tomoyo/load_policy.o > > > > Symbol table '.symtab' contains 4 entries: > > Num: Value Size Type Bind Vis Ndx Name > > 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND > > 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS load_policy.c > > 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 .text.asan.module_ctor > > 3: 0000000000000000 1 FUNC LOCAL DEFAULT 3 asan.module_ctor > > > > After: > > > > $ llvm-nm -S security/tomoyo/load_policy.o > > 0000000000000000 0000000000000001 t asan.module_ctor > > > > $ llvm-readelf -s security/tomoyo/load_policy.o > > > > Symbol table '.symtab' contains 3 entries: > > Num: Value Size Type Bind Vis Ndx Name > > 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND > > 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS load_policy.c > > 2: 0000000000000000 1 FUNC LOCAL DEFAULT 3 asan.module_ctor > > > > The problem seems to be that we need to add a local symbols because LLVM > helpfully stripped all unused section symbols. > > The way we do that, is by moving a the first non-local symbol to the > end, thereby creating a hole where we can insert a new local symbol. > Because ELF very helpfully mandates that local symbols must come before > non-local symbols and keeps the symbols index of the first non-local in > sh_info. > > Thing is, the above object files don't appear to have a non-local symbol > so the swizzle thing isn't needed, and apparently the value in sh_info > isn't valid either. > > Does something simple like this work? If not, I'll try and reproduce > tomorrow, it shouldn't be too hard to fix. That diff obviously gets rid of the "no non-local symbols" message but I still see the "invalid section index" message. I'll be offline tomorrow but if you have issues reproducing it, I'll be happy to help on Wednesday. At the time I am writing this, apt.llvm.org packages have not been updated to include that LLVM change I mentioned; hopefully they will be soon. Thanks for the quick response! Nathan > diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c > index 583a3ec987b5..baabf38a2a11 100644 > --- a/tools/objtool/elf.c > +++ b/tools/objtool/elf.c > @@ -618,8 +618,7 @@ static int elf_move_global_symbol(struct elf *elf, struct section *symtab, > > sym = find_symbol_by_index(elf, first_non_local); > if (!sym) { > - WARN("no non-local symbols !?"); > - return first_non_local; > + return symtab->sh.sh_size / sizeof(sym->sym); > } > > s = elf_getscn(elf->elf, symtab->idx); >