[lttng-dev] [PATCH] Fix linker library order

Francis Giraldeau francis.giraldeau at gmail.com
Tue May 14 14:32:24 EDT 2013


Le 2013-05-14 13:38, Simon Marchi a écrit :
> On 14 May 2013 08:37, Mathieu Desnoyers <mathieu.desnoyers at efficios.com> wrote:
>> * Mathieu Desnoyers (mathieu.desnoyers at efficios.com) wrote:
>>> * Alexandre Montplaisir (alexmonthy at voxpopuli.im) wrote:
>>>> On 13-05-11 10:59 PM, Mathieu Desnoyers wrote:
>>>>> * Francis Giraldeau (francis.giraldeau at gmail.com) wrote:
>>>>>> Libraries must be specified after the binary target.
>>>>> merged, thanks!
>>>>>
>>>>> Mathieu
>>>> This seems to have broken the daily PPA packages:
>>>> https://launchpadlibrarian.net/139804087/buildlog_ubuntu-saucy-amd64.lttng-ust_2.2~pre-0%2Bbzr1574%2Bpack37%2B201305131247~saucy1_FAILEDTOBUILD.txt.gz
>>>>
>>>> That package has no particular patches. If I build it locally from
>>>> source it builds fine, but if I build the package locally (with
>>>> dpkg-buildpackage), I get the same error. It could be related to the
>>>> --as-needed problem we've had before...
>>> Francis, can you explain why your change was needed in the first place ?
>> Hrm, actually, these patches are wrong.
>
> I believe these patches are correct.
>
>> commit 725e63c5194bfdcde0a2a3507aca156ba36cf49f for instance:
>>
>> "Libraries must be specified after the binary target."
>>
>>  demo: demo.o
>> -       $(CC) -o $@ $(LIBS) $^
>> +       $(CC) -o $@ $^ $(LIBS)
>>
>> the binary target here is "$@".
>>
>> $^ is the source file name (demo.c).
>>
>> this patch moves the source file name prior to the libraries, which is
>> incorrect (ref: gcc(1)). The input files should appear last.
>>
>> So it breaks builds where $(LIBS) is non-empty.
> Actually, $^ here is "demo.o", not "demo. Also, the libs should appear
> after the objects on the command line. See the "-l" section in
> http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html. On most setup
> this doesn't matter, since -Wl,--no-as-needed was the default pretty
> much everywhere. Ubuntu decided to use -Wl,--as-needed to avoid
> unnecessary dependencies, so the order becomes important. If you try
> to manual build on a recent Ubuntu you will get undefined references
> to dlopen and such. So this patch is good.
>
> If you read carefully the log sent by Alexandre, you see that it is
> when building the shared libs in this directory
> (lttng-ust-provider-ust-tests-demo.so) that the build fails. I don't
> know why it fails, but Alexandre hinted that passing "-fPIE -pie" to
> build a shared library is weird (it is usually -fPIC -pic). I am not
> sure where that comes from. This behaviour only happens when building
> the package, not when building manually.

It seems quite right. Here is what happens with prior library order:

$ cd lttng-ust/doc/examples/demo
$ make
gcc -o demo -ldl     demo.o
demo.o: In function `__tracepoint__init_urcu_sym':
demo.c:(.text+0x20): undefined reference to `dlsym'

By inverting library order as specified in patches, the compilation
succeeds:

$ make
gcc -o demo demo.o -ldl

So, reverting the patches will break the build. We should look at the
other problem related to packaging and fix it.

Thanks,

Francis

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4489 bytes
Desc: Signature cryptographique S/MIME
URL: <http://lists.lttng.org/pipermail/lttng-dev/attachments/20130514/9a0dbc60/attachment.bin>


More information about the lttng-dev mailing list