diff mbox

rules.mak: Force CFLAGS for all objects in DSO

Message ID 1430920000-31229-1-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng May 6, 2015, 1:46 p.m. UTC
Because of the trick of process-archive-undefs, all .mo objects, even
with --enable-modules, are dependencies of executables.

This breaks CFLAGS propogation because the compiling of module object
will happen too early before building for DSO.

With GCC 5, the linking would fail because .o doesn't have -fPIC. Also,
BUILD_DSO will be missed. (module-common.o will have it, so the stamp
symbol was still liked in .so).

Fix the problem by forcing the CFLAGS during unnest-vars.

Reported-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 rules.mak | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Paolo Bonzini May 6, 2015, 2:07 p.m. UTC | #1
On 06/05/2015 15:46, Fam Zheng wrote:
> Because of the trick of process-archive-undefs, all .mo objects, even
> with --enable-modules, are dependencies of executables.
> 
> This breaks CFLAGS propogation because the compiling of module object
> will happen too early before building for DSO.
> 
> With GCC 5, the linking would fail because .o doesn't have -fPIC. Also,
> BUILD_DSO will be missed. (module-common.o will have it, so the stamp
> symbol was still liked in .so).
> 
> Fix the problem by forcing the CFLAGS during unnest-vars.
> 
> Reported-by: Alexander Graf <agraf@suse.de>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  rules.mak | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/rules.mak b/rules.mak
> index 3a05627..6c0caf3 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -102,7 +102,6 @@ endif
>  %.o: %.dtrace
>  	$(call quiet-command,dtrace -o $@ -G -s $<, "  GEN   $(TARGET_DIR)$@")
>  
> -%$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
>  %$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
>  %$(DSOSUF): %.mo
>  	$(call LINK,$^)
> @@ -353,6 +352,7 @@ define unnest-vars
>               $(foreach o,$($v),
>                     $(eval $o: $($o-objs)))
>               $(eval $(patsubst %-m,%-y,$v) += $($v))
> +             $(eval $($v:%.mo=%$(DSOSUF)) $($v) $(foreach o,$($v),$($o-objs)) .PHONY: CFLAGS += -fPIC -DBUILD_DSO)

Can you explain the various parts to the left of the colon?

Thanks,

Paolo

>               $(eval modules: $($v:%.mo=%$(DSOSUF))),
>               $(eval $(patsubst %-m,%-y,$v) += $(call expand-objs, $($v)))))
>  
>
Fam Zheng May 6, 2015, 2:23 p.m. UTC | #2
On Wed, 05/06 16:07, Paolo Bonzini wrote:
> 
> 
> On 06/05/2015 15:46, Fam Zheng wrote:
> > Because of the trick of process-archive-undefs, all .mo objects, even
> > with --enable-modules, are dependencies of executables.
> > 
> > This breaks CFLAGS propogation because the compiling of module object
> > will happen too early before building for DSO.
> > 
> > With GCC 5, the linking would fail because .o doesn't have -fPIC. Also,
> > BUILD_DSO will be missed. (module-common.o will have it, so the stamp
> > symbol was still liked in .so).
> > 
> > Fix the problem by forcing the CFLAGS during unnest-vars.
> > 
> > Reported-by: Alexander Graf <agraf@suse.de>
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  rules.mak | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/rules.mak b/rules.mak
> > index 3a05627..6c0caf3 100644
> > --- a/rules.mak
> > +++ b/rules.mak
> > @@ -102,7 +102,6 @@ endif
> >  %.o: %.dtrace
> >  	$(call quiet-command,dtrace -o $@ -G -s $<, "  GEN   $(TARGET_DIR)$@")
> >  
> > -%$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
> >  %$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
> >  %$(DSOSUF): %.mo
> >  	$(call LINK,$^)
> > @@ -353,6 +352,7 @@ define unnest-vars
> >               $(foreach o,$($v),
> >                     $(eval $o: $($o-objs)))
> >               $(eval $(patsubst %-m,%-y,$v) += $($v))
> > +             $(eval $($v:%.mo=%$(DSOSUF)) $($v) $(foreach o,$($v),$($o-objs)) .PHONY: CFLAGS += -fPIC -DBUILD_DSO)
                                ^               ^                ^                   ^
                                |               |                |                   |
                                |               |                |                   `- In case all others are empty.
                                |               |                |
                                |               |                `- Expansion of all %.mo-objs so it's a %.o list.
                                |               |                   For $v=block-obj-m, this will contain curl.o, iscsi.o, ...
                                |               |
                                |               `- %.mo list
                                |                  For $v=block-obj-m, this will contain curl.mo, iscsi.mo, ...
                                |
                                `- %.so list
                                   For $v=block-obj-m, this will contain curl.so, iscsi.so, ...
> 
> Can you explain the various parts to the left of the colon?

Context:

 - The line is inside "$(if $(CONFIG_MODULES),...)"
 - $v is one of "block-job-m common-obj-m ..."
 - So, $($v) is the module object list "foo.mo bar.mo ..."

Do you want a respin to include the ascii art? :)

Fam
Paolo Bonzini May 6, 2015, 2:36 p.m. UTC | #3
On 06/05/2015 16:23, Fam Zheng wrote:
>>> > > +             $(eval $($v:%.mo=%$(DSOSUF)) $($v) $(foreach o,$($v),$($o-objs)) .PHONY: CFLAGS += -fPIC -DBUILD_DSO)
>                                 ^               ^                ^                   ^
>                                 |               |                |                   |
>                                 |               |                |                   `- In case all others are empty.
>                                 |               |                |
>                                 |               |                `- Expansion of all %.mo-objs so it's a %.o list.
>                                 |               |                   For $v=block-obj-m, this will contain curl.o, iscsi.o, ...
>                                 |               |
>                                 |               `- %.mo list
>                                 |                  For $v=block-obj-m, this will contain curl.mo, iscsi.mo, ...
>                                 |
>                                 `- %.so list
>                                    For $v=block-obj-m, this will contain curl.so, iscsi.so, .

Great. :)  You should have used Unicode drawing characters to be
consistent with rules.mak!

But hopefully the ASCII art is not needed at all.  Do we need all of those?

- foo.mo is a prerequisite of foo.so.  You cannot use foo.so (this is
the bug you are fixing) but foo.so doesn't use CFLAGS in its rule, and
you should be able to remove it.

- can you use foo.mo without hitting the original bug?  If so, could you
simply use:

-%$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
+%.mo: CFLAGS += -fPIC -DBUILD_DSO

(and if so move the rule down, above "%.mo:")?  If you cannot use
foo.mo, foo.mo also doesn't use CFLAGS in its rules, and you should be
able to remove foo.mo too.

- so the other possibility is to just use $(foreach o,$($v),$($o-objs)).
 In this case there's already a convenient $(foreach) just above, and
you can just add another $(eval) inside it.

- and if that is true, you do not need .PHONY either because you have
$(foreach ... $(eval)) instead of $(eval $(foreach)).

Maybe I'm wrong, in which case the patch is ok. :)

Paolo
Fam Zheng May 6, 2015, 3:01 p.m. UTC | #4
On Wed, 05/06 16:36, Paolo Bonzini wrote:
> 
> 
> On 06/05/2015 16:23, Fam Zheng wrote:
> >>> > > +             $(eval $($v:%.mo=%$(DSOSUF)) $($v) $(foreach o,$($v),$($o-objs)) .PHONY: CFLAGS += -fPIC -DBUILD_DSO)
> >                                 ^               ^                ^                   ^
> >                                 |               |                |                   |
> >                                 |               |                |                   `- In case all others are empty.
> >                                 |               |                |
> >                                 |               |                `- Expansion of all %.mo-objs so it's a %.o list.
> >                                 |               |                   For $v=block-obj-m, this will contain curl.o, iscsi.o, ...
> >                                 |               |
> >                                 |               `- %.mo list
> >                                 |                  For $v=block-obj-m, this will contain curl.mo, iscsi.mo, ...
> >                                 |
> >                                 `- %.so list
> >                                    For $v=block-obj-m, this will contain curl.so, iscsi.so, .
> 
> Great. :)  You should have used Unicode drawing characters to be
> consistent with rules.mak!

Well, I'd have to find and read the vim plugin doc to do that again!

> 
> But hopefully the ASCII art is not needed at all.  Do we need all of those?
> 
> - foo.mo is a prerequisite of foo.so.  You cannot use foo.so (this is
> the bug you are fixing) but foo.so doesn't use CFLAGS in its rule, and
> you should be able to remove it.
> 
> - can you use foo.mo without hitting the original bug?  If so, could you
> simply use:
> 
> -%$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
> +%.mo: CFLAGS += -fPIC -DBUILD_DSO

I believe this will propagate the flags correctly. However that will affect
non-module build, so I didn't want to do it unconditionally.

> 
> (and if so move the rule down, above "%.mo:")?  If you cannot use
> foo.mo, foo.mo also doesn't use CFLAGS in its rules, and you should be
> able to remove foo.mo too.
> 
> - so the other possibility is to just use $(foreach o,$($v),$($o-objs)).
>  In this case there's already a convenient $(foreach) just above, and
> you can just add another $(eval) inside it.
> 
> - and if that is true, you do not need .PHONY either because you have
> $(foreach ... $(eval)) instead of $(eval $(foreach)).
> 

OK.

It's been a long day for me, so you can see that I'm going defensive with the
code I'm writing, but yes, your last "if" looks about right, except we still
need the "$(if $(CONFIG_MODULES),...)".

Sanity check: is -fPIC only ever needed in compiling, but not in (partial)
linking, right?

Fam
Paolo Bonzini May 6, 2015, 3:03 p.m. UTC | #5
On 06/05/2015 17:01, Fam Zheng wrote:
>> > -%$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
>> > +%.mo: CFLAGS += -fPIC -DBUILD_DSO
> I believe this will propagate the flags correctly. However that will affect
> non-module build, so I didn't want to do it unconditionally.

You're right.  You'd need something like
$(call lif $(CONFIG_MODULES), -fPIC -DBUILD_DSO) instead.

>> > (and if so move the rule down, above "%.mo:")?  If you cannot use
>> > foo.mo, foo.mo also doesn't use CFLAGS in its rules, and you should be
>> > able to remove foo.mo too.
>> > 
>> > - so the other possibility is to just use $(foreach o,$($v),$($o-objs)).
>> >  In this case there's already a convenient $(foreach) just above, and
>> > you can just add another $(eval) inside it.
>> > 
>> > - and if that is true, you do not need .PHONY either because you have
>> > $(foreach ... $(eval)) instead of $(eval $(foreach)).
>> > 
> OK.
> 
> It's been a long day for me, so you can see that I'm going defensive with the
> code I'm writing, but yes, your last "if" looks about right, except we still
> need the "$(if $(CONFIG_MODULES),...)".

Understood entirely.  But there's no hurry, sleep over it and take your
time to test it tomorrow.

> Sanity check: is -fPIC only ever needed in compiling, but not in (partial)
> linking, right?

Yes.  It's LDFLAGS_SHARED that is used in linking (and nothing in
partial linking).

Paolo
Alexander Graf May 6, 2015, 11:25 p.m. UTC | #6
On 06.05.15 15:46, Fam Zheng wrote:
> Because of the trick of process-archive-undefs, all .mo objects, even
> with --enable-modules, are dependencies of executables.
> 
> This breaks CFLAGS propogation because the compiling of module object
> will happen too early before building for DSO.
> 
> With GCC 5, the linking would fail because .o doesn't have -fPIC. Also,
> BUILD_DSO will be missed. (module-common.o will have it, so the stamp
> symbol was still liked in .so).
> 
> Fix the problem by forcing the CFLAGS during unnest-vars.
> 
> Reported-by: Alexander Graf <agraf@suse.de>
> Signed-off-by: Fam Zheng <famz@redhat.com>

As a heads-up I just verified that this patch does indeed fix
compilation with gcc5 for me. However looking at the mail thread I
assume there's a v2 coming, so I'll hold off my tested-by tag ;).

For the final patch, we will probably also want to have it in the
qemu-stable tree, so that people will be able to compile older versions
of qemu (and modules) with newer compilers.


Alex
diff mbox

Patch

diff --git a/rules.mak b/rules.mak
index 3a05627..6c0caf3 100644
--- a/rules.mak
+++ b/rules.mak
@@ -102,7 +102,6 @@  endif
 %.o: %.dtrace
 	$(call quiet-command,dtrace -o $@ -G -s $<, "  GEN   $(TARGET_DIR)$@")
 
-%$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
 %$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
 %$(DSOSUF): %.mo
 	$(call LINK,$^)
@@ -353,6 +352,7 @@  define unnest-vars
              $(foreach o,$($v),
                    $(eval $o: $($o-objs)))
              $(eval $(patsubst %-m,%-y,$v) += $($v))
+             $(eval $($v:%.mo=%$(DSOSUF)) $($v) $(foreach o,$($v),$($o-objs)) .PHONY: CFLAGS += -fPIC -DBUILD_DSO)
              $(eval modules: $($v:%.mo=%$(DSOSUF))),
              $(eval $(patsubst %-m,%-y,$v) += $(call expand-objs, $($v)))))