From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932093AbdFNInM (ORCPT ); Wed, 14 Jun 2017 04:43:12 -0400 Received: from mail-wr0-f173.google.com ([209.85.128.173]:32915 "EHLO mail-wr0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752154AbdFNImY (ORCPT ); Wed, 14 Jun 2017 04:42:24 -0400 Subject: Re: [RFC PATCH 04/10] objtool: add undwarf debuginfo generation To: Josh Poimboeuf , x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Linus Torvalds , Andy Lutomirski , Ingo Molnar , "H. Peter Anvin" , Peter Zijlstra References: <848a1c6a1384ff5dd40ff204e1ace7e07559fde0.1496293620.git.jpoimboe@redhat.com> From: Jiri Slaby Message-ID: Date: Wed, 14 Jun 2017 10:42:19 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 In-Reply-To: <848a1c6a1384ff5dd40ff204e1ace7e07559fde0.1496293620.git.jpoimboe@redhat.com> Content-Type: text/plain; charset=iso-8859-2 Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/01/2017, 07:44 AM, Josh Poimboeuf wrote: ... > index 3fb0747..1ca5d9a 100644 > --- a/tools/objtool/elf.c > +++ b/tools/objtool/elf.c ... > +int elf_write_to_file(struct elf *elf, char *outfile) > +{ > + int fd; > + struct section *sec; > + Elf *elfout; > + GElf_Ehdr eh, ehout; > + Elf_Scn *scn; > + Elf_Data *data; > + GElf_Shdr sh; > + > + fd = creat(outfile, 0777); 0755 even though it is umasked? > + if (fd == -1) { > + perror("creat"); > + return -1; > + } > + > + elfout = elf_begin(fd, ELF_C_WRITE, NULL); > + if (!elfout) { > + perror("elf_begin"); > + return -1; > + } > + > + if (!gelf_newehdr(elfout, gelf_getclass(elf->elf))) { > + perror("gelf_newehdr"); > + return -1; > + } > + > + if (!gelf_getehdr(elfout, &ehout)) { This does not make much sense to do. You memset(0) it below. > + perror("gelf_getehdr"); > + return -1; > + } > + > + if (!gelf_getehdr(elf->elf, &eh)) { > + perror("gelf_getehdr"); > + return -1; > + } > + > + memset(&ehout, 0, sizeof(ehout)); > + ehout.e_ident[EI_DATA] = eh.e_ident[EI_DATA]; > + ehout.e_machine = eh.e_machine; > + ehout.e_type = eh.e_type; > + ehout.e_version = EV_CURRENT; > + ehout.e_shstrndx = find_section_by_name(elf, ".shstrtab")->idx; > + > + list_for_each_entry(sec, &elf->sections, list) { > + if (sec->idx == 0) > + continue; > + > + scn = elf_newscn(elfout); > + if (!scn) { > + perror("elf_newscn"); > + return -1; > + } > + > + data = elf_newdata(scn); > + if (!data) { > + perror("elf_newdata"); > + return -1; > + } > + > + if (!elf_flagdata(data, ELF_C_SET, ELF_F_DIRTY)) { > + perror("elf_flagdata"); > + return -1; > + } There is not much point setting DIRTY flag here. elf_newdata does so. > + data->d_type = sec->data->d_type; > + data->d_buf = sec->data->d_buf; > + data->d_size = sec->data->d_size; > + > + if(!gelf_getshdr(scn, &sh)) { > + perror("gelf_getshdr"); > + return -1; > + } This does not make much sense to do again. You overwrite the content right away: > + sh = sec->sh; > + > + if (!gelf_update_shdr(scn, &sh)) { > + perror("gelf_update_shdr"); > + return -1; > + } > + } > + > + if (!gelf_update_ehdr(elfout, &ehout)) { > + perror("gelf_update_ehdr"); > + return -1; > + } > + > + if (elf_update(elfout, ELF_C_WRITE) < 0) { > + perror("elf_update"); > + return -1; > + } elf_end() + close() ? > + > + return 0; > +} > + > void elf_close(struct elf *elf) > { > struct section *sec, *tmpsec; ... > --- /dev/null > +++ b/tools/objtool/undwarf.c > @@ -0,0 +1,308 @@ ... > +int undwarf_dump(const char *_objname) > +{ > + struct elf *elf; > + struct section *sec; > + struct rela *rela; > + struct undwarf *undwarf; > + int nr, i; > + > + objname = _objname; > + > + elf = elf_open(objname); > + if (!elf) { > + WARN("error reading elf file %s\n", objname); > + return 1; > + } > + > + sec = find_section_by_name(elf, ".undwarf"); > + if (!sec || !sec->rela) > + return 0; > + > + nr = sec->len / sizeof(*undwarf); > + for (i = 0; i < nr; i++) { ... > + } elf_close() ? > + > + return 0; > +} thanks, -- js suse labs