From: Rusty Russell <rusty@rustcorp.com.au>
To: Frantisek Hrbata <fhrbata@redhat.com>
Cc: Kyle McMartin <kyle@infradead.org>,
linux-kernel@vger.kernel.org, jstancek@redhat.com,
keescook@chromium.org, peter.oberparleiter@de.ibm.com,
linux-arch@vger.kernel.org, arnd@arndb.de, mgahagan@redhat.com,
agospoda@redhat.com, akpm@linux-foundation.org
Subject: Re: [PATCH v2 4/4] kernel: add support for init_array constructors
Date: Tue, 10 Sep 2013 15:05:57 +0930 [thread overview]
Message-ID: <878uz544si.fsf@rustcorp.com.au> (raw)
In-Reply-To: <20130909162814.GA2288@localhost.localdomain>
Frantisek Hrbata <fhrbata@redhat.com> writes:
> On Mon, Sep 09, 2013 at 10:44:03AM +0930, Rusty Russell wrote:
>> Kyle McMartin <kyle@infradead.org> writes:
>> > On Fri, Sep 06, 2013 at 07:51:18PM +0200, Frantisek Hrbata wrote:
>> >> > > v2: - reuse mod->ctors for .init_array section for modules, because gcc uses
>> >> > > .ctors or .init_array, but not both at the same time
>> >> > >
>> >> > > Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
>> >> >
>> >> > Might be nice to document which gcc version changed this, so people can
>> >> > choose whether to cherry-pick this change?
>> >>
>> >> Thank you for pointing this out. As per gcc git this was introduced by commit
>> >> ef1da80 and released in 4.7 version.
>> >>
>> >> $ git describe --contains ef1da80
>> >> gcc-4_7_0-release~4358
>> >>
>> >> Do you want me to post v3 with this info included in the descrition?
>> >>
>> >
>> > It actually depends on the combination of binutils/ld and gcc you use, not
>> > simply which gcc version you use. :/
>>
>> Indeed, and seems it was binutils 20110507 which actually handled it
>> properly.
>>
>> AFAICT it's theoretically possible to have .ctors and .init_array in a
>> module. Unlikely, but the patch should check for both and refuse to
>> load the module in that case. Otherwise weird things would happen.
>
> I'm not sure if coexistence of .ctors and .init_array sections should result in
> denial of module, but I for sure know nothing about this :). Could you maybe
> privide one example of the "weird thing"?
Well, if we have both ctors and init_array, and we only call the ctors,
part of the module will be uninitialized.
I was thinking about something like the following (based on your
previous patch).
Thoughts?
Rusty.
From: Frantisek Hrbata <fhrbata@redhat.com>
Subject: kernel: add support for init_array constructors
This adds the .init_array section as yet another section with constructors. This
is needed because gcc could add __gcov_init calls to .init_array or .ctors
section, depending on gcc (and binutils) version .
v2: - reuse mod->ctors for .init_array section for modules, because gcc uses
.ctors or .init_array, but not both at the same time
v3: - fail to load if that does happen somehow.
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 83e2c31..bc2121f 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -473,6 +473,7 @@
#define KERNEL_CTORS() . = ALIGN(8); \
VMLINUX_SYMBOL(__ctors_start) = .; \
*(.ctors) \
+ *(.init_array) \
VMLINUX_SYMBOL(__ctors_end) = .;
#else
#define KERNEL_CTORS()
diff --git a/kernel/module.c b/kernel/module.c
index dc58274..d3f5a58 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2738,7 +2738,7 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags)
return 0;
}
-static void find_module_sections(struct module *mod, struct load_info *info)
+static int find_module_sections(struct module *mod, struct load_info *info)
{
mod->kp = section_objs(info, "__param",
sizeof(*mod->kp), &mod->num_kp);
@@ -2768,6 +2768,18 @@ static void find_module_sections(struct module *mod, struct load_info *info)
#ifdef CONFIG_CONSTRUCTORS
mod->ctors = section_objs(info, ".ctors",
sizeof(*mod->ctors), &mod->num_ctors);
+ if (!mod->ctors)
+ mod->ctors = section_objs(info, ".init_array",
+ sizeof(*mod->ctors), &mod->num_ctors);
+ else if (find_sec(info, ".init_array")) {
+ /*
+ * This shouldn't happen with same compiler and binutils
+ * building all parts of the module.
+ */
+ printk(KERN_WARNING "%s: has both .ctors and .init_array.\n",
+ mod->name);
+ return -EINVAL;
+ }
#endif
#ifdef CONFIG_TRACEPOINTS
@@ -2806,6 +2818,8 @@ static void find_module_sections(struct module *mod, struct load_info *info)
info->debug = section_objs(info, "__verbose",
sizeof(*info->debug), &info->num_debug);
+
+ return 0;
}
static int move_module(struct module *mod, struct load_info *info)
@@ -3263,7 +3277,9 @@ static int load_module(struct load_info *info, const char __user *uargs,
/* Now we've got everything in the final locations, we can
* find optional sections. */
- find_module_sections(mod, info);
+ err = find_module_sections(mod, info);
+ if (err)
+ goto free_unload;
err = check_module_license_and_versions(mod);
if (err)
next prev parent reply other threads:[~2013-09-10 11:47 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-04 14:42 [PATCH v2 0/4] add support for gcov format introduced in gcc 4.7 Frantisek Hrbata
2013-09-04 14:42 ` [PATCH v2 1/4] gcov: move gcov structs definitions to a gcc version specific file Frantisek Hrbata
2013-09-04 14:42 ` [PATCH v2 2/4] gcov: add support for gcc 4.7 gcov format Frantisek Hrbata
2013-09-18 21:22 ` Andrew Morton
2013-09-18 21:27 ` Joe Perches
2013-09-18 21:31 ` Andrew Morton
2013-09-19 10:12 ` Frantisek Hrbata
2013-09-19 9:04 ` Peter Oberparleiter
2013-09-19 10:21 ` Frantisek Hrbata
2013-09-19 10:31 ` Peter Oberparleiter
2013-09-04 14:42 ` [PATCH v2 3/4] gcov: compile specific gcov implementation based on gcc version Frantisek Hrbata
2013-09-04 14:42 ` [PATCH v2 4/4] kernel: add support for init_array constructors Frantisek Hrbata
2013-09-06 2:13 ` Rusty Russell
2013-09-06 17:51 ` Frantisek Hrbata
2013-09-06 18:07 ` Kyle McMartin
2013-09-09 1:14 ` Rusty Russell
2013-09-09 16:28 ` Frantisek Hrbata
2013-09-10 0:15 ` Kyle McMartin
2013-09-10 5:35 ` Rusty Russell [this message]
2013-09-10 13:28 ` Frantisek Hrbata
2013-09-11 1:52 ` Rusty Russell
2013-09-26 23:11 ` [PATCH v2 0/4] add support for gcov format introduced in gcc 4.7 Christophe Guillon
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=878uz544si.fsf@rustcorp.com.au \
--to=rusty@rustcorp.com.au \
--cc=agospoda@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=fhrbata@redhat.com \
--cc=jstancek@redhat.com \
--cc=keescook@chromium.org \
--cc=kyle@infradead.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mgahagan@redhat.com \
--cc=peter.oberparleiter@de.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.