[PATCH 2/3] build: fix DSO dependencies

Felipe Contreras felipe.contreras at gmail.com
Fri Oct 29 16:17:18 PDT 2010


Hello,

On Sat, Oct 30, 2010 at 12:37 AM, Carl Worth <cworth at cworth.org> wrote:
> On Sat,  5 Jun 2010 14:05:14 +0300, Felipe Contreras <felipe.contreras at gmail.com> wrote:
>> At least on Fedora 13, this doesn't link; the linker finds the
>> dependencies, and aborts saying we should include them.
> ...
>> We do need to link at least to what we really use, the linker resolves
>> the dependencies of our dependencies at loading time. So let's only
>> specify what we use directly.
>
> You're certainly right that the linking was bogus. The notmuch binary
> was only linking directly against libnotmuch (which in turned linked
> against GMime, Xapian, and talloc). But meanwhile, the notmuch binary
> is also directly using GMime and talloc so should be linking directly
> against those.
>
>> -ifneq ($(LINKER_RESOLVES_LIBRARY_DEPENDENCIES),1)
>>  FINAL_NOTMUCH_LDFLAGS += $(CONFIGURE_LDFLAGS)
>> -FINAL_NOTMUCH_LINKER = CXX
>> -endif
>
> But the change above causes the notmuch binary to also link directly
> against Xapian, (which the binary does not use directly), so that's
> undesired.

Yes, I wanted to fix that in subsequent patches, but my first
objective was to get it to build.

>> -     gmime_ldflags=$(pkg-config --libs $gmimepc)
>> +     if [ $linker_resolves_library_dependencies = "1" ]; then
>> +             gmime_ldflags="-lgmime-2.6 -lgobject-2.0 -lglib-2.0"
>> +     else
>> +             gmime_ldflags=$(pkg-config --libs $gmimepc)
>> +     fi
>
> This part I don't understand. Why is it necessary to avoid using
> pkg-config in this case? That sounds to me like a maintenance
> nightmare. If the pkg-config information for GMime is wrong then we
> should get that fixed, and not workaround it.

Well, it's not possible: pkg-config is supposed to work on win32 and
osx, so all the dependencies must be there, so:

% pkg-config --libs gmime-2.6
-pthread -lgmime-2.6 -lgio-2.0 -lgobject-2.0 -lgmodule-2.0
-lgthread-2.0 -lrt -lglib-2.0

Means we would be linking to many libraries we are not going to use directly.

Fortunately, I found the solution after writing that patch:
-Wl,--as-needed. With this the linker would automatically figure out
that we actually want to link only to -lgmime-2.6 -lgobject-2.0
-lglib-2.0.

> So, finally, I implemented a much more narrow fix for the linking
> problem, (simply adding $(GMIME_LDFLAGS) and $(TALLOC_LDFLAGS) to the
> FINAL_NOTMUCH_LDFLAGS assignement).
>
> I tested this by installing binutils-gold on my Debian system. This
> caused a compilation failure before my patch, but compilation succeeds
> after my patch. I'm optimistic that this means that a Fedora compilation
> will work as well now. Can you test that please?

Patch #1 is not needed if gmime_ldflags in patch #2 are not changed
conditionally, which can be achieved by --as-needed.

I just sent my proposed updated patches.

-- 
Felipe Contreras


More information about the notmuch mailing list