Michael Tautschnig <m...@debian.org> writes:

> The package build process produces an archive libwmlscript.a as follows:
>
> ar rc libwmlscript.a wmlscript/wmlsc.o ...
>
> with wmlsc already containing a "main" function. Subsequently libwmlscript.a 
> is
> linked to multiple object files containing their own main function (including
> wmlscript/wmlsc.o, again), which leads to duplicate definitions of main, and
> thus undefined behaviour as the linker is free to pick either of them.

I don't believe there is undefined behaviour in this case.
Details below.  Regardless, fixing this would make the sources
easier to understand.

The linker does not link all the members of libwmlscript.a into
the output file, only those that satisfy undefined references.
So although libwmlscript.a(wmlsc.o) and libwmlscript.a(wmlsdasm.o)
both define a main function, the linker links neither of those
because it already has a main function from the wmlsc.o that was
specified in the command line, and those members do not satisfy
any other undefined references either.

libwmlscript.a(wmlsdasm.o) also defines a lookup_function symbol.
If you add the -Wl,--undefined=lookup_function option to the gcc
command that links wmlscript/wmlsc from wmlscript/wmlsc.o,
libwmlscript.a, and other archives, then the linker will link
libwmlscript.a(wmlsdasm.o) in order to satisfy the reference to
lookup_function.  That then causes an error:

libwmlscript.a(wmlsdasm.o): In function `main':
/home/kalle/build/kannel/wmlscript/wmlsdasm.c:98: multiple definition of `main'
wmlscript/wmlsc.o:/home/kalle/build/kannel/wmlscript/wmlsc.c:115: first defined 
here
collect2: error: ld returned 1 exit status

Because that error does not normally occur during the build, I think it
is clear that the linker normally links neither libwmlscript.a(wmlsc.o)
nor libwmlscript.a(wmlsdasm.o) into the output file wmlscript/wmlsc.

If you instead removed wmlscript/wmlsc.o from the command line,
then the linker would try to find a main function in the archives,
and I think it could choose either libwmlscript.a(wmlsc.o) or
libwmlscript.a(wmlsdasm.o).  I think that would be undefined behaviour.


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to