Does the order of .o files matter when linking against a static library?

 

I ask this because I'm having problems linking ntoskrnl with rtl dependending on the order of object files when compiling rtl. For example on the rbuild generated makefile.auto the order of .o files is :

 

rtl_OBJS := \

            $(INTERMEDIATE)\lib\rtl\austin\avl.o \

            $(INTERMEDIATE)\lib\rtl\austin\tree.o \

            $(INTERMEDIATE)\lib\rtl\access.o \

            $(INTERMEDIATE)\lib\rtl\acl.o \

            $(INTERMEDIATE)\lib\rtl\atom.o \

            $(INTERMEDIATE)\lib\rtl\bitmap.o \

            $(INTERMEDIATE)\lib\rtl\bootdata.o \

            $(INTERMEDIATE)\lib\rtl\compress.o \

            $(INTERMEDIATE)\lib\rtl\condvar.o \

            $(INTERMEDIATE)\lib\rtl\crc32.o \

            $(INTERMEDIATE)\lib\rtl\critical.o \

            $(INTERMEDIATE)\lib\rtl\dbgbuffer.o \

            $(INTERMEDIATE)\lib\rtl\debug.o \

            $(INTERMEDIATE)\lib\rtl\dos8dot3.o \

            $(INTERMEDIATE)\lib\rtl\encode.o \

            $(INTERMEDIATE)\lib\rtl\env.o \

            $(INTERMEDIATE)\lib\rtl\error.o \

            $(INTERMEDIATE)\lib\rtl\exception.o \

            $(INTERMEDIATE)\lib\rtl\generictable.o \

            $(INTERMEDIATE)\lib\rtl\handle.o \

            $(INTERMEDIATE)\lib\rtl\heap.o \

            $(INTERMEDIATE)\lib\rtl\image.o \

            $(INTERMEDIATE)\lib\rtl\message.o \

            $(INTERMEDIATE)\lib\rtl\largeint.o \

            $(INTERMEDIATE)\lib\rtl\luid.o \

            $(INTERMEDIATE)\lib\rtl\network.o \

            $(INTERMEDIATE)\lib\rtl\nls.o \

            $(INTERMEDIATE)\lib\rtl\path.o \

            $(INTERMEDIATE)\lib\rtl\ppb.o \

            $(INTERMEDIATE)\lib\rtl\process.o \

            $(INTERMEDIATE)\lib\rtl\propvar.o \

            $(INTERMEDIATE)\lib\rtl\qsort.o \

            $(INTERMEDIATE)\lib\rtl\random.o \

            $(INTERMEDIATE)\lib\rtl\rangelist.o \

            $(INTERMEDIATE)\lib\rtl\registry.o \

            $(INTERMEDIATE)\lib\rtl\res.o \

            $(INTERMEDIATE)\lib\rtl\resource.o \

            $(INTERMEDIATE)\lib\rtl\sd.o \

            $(INTERMEDIATE)\lib\rtl\security.o \

            $(INTERMEDIATE)\lib\rtl\sid.o \

            $(INTERMEDIATE)\lib\rtl\sprintf.o \

            $(INTERMEDIATE)\lib\rtl\srw.o \

            $(INTERMEDIATE)\lib\rtl\swprintf.o \

            $(INTERMEDIATE)\lib\rtl\splaytree.o \

            $(INTERMEDIATE)\lib\rtl\thread.o \

            $(INTERMEDIATE)\lib\rtl\time.o \

            $(INTERMEDIATE)\lib\rtl\timezone.o \

            $(INTERMEDIATE)\lib\rtl\timerqueue.o \

            $(INTERMEDIATE)\lib\rtl\unicode.o \

            $(INTERMEDIATE)\lib\rtl\unicodeprefix.o \

            $(INTERMEDIATE)\lib\rtl\vectoreh.o \

            $(INTERMEDIATE)\lib\rtl\version.o \

            $(INTERMEDIATE)\lib\rtl\workitem.o \

            $(INTERMEDIATE)\lib\rtl\i386\debug_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\except_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\except.o \

            $(INTERMEDIATE)\lib\rtl\i386\random_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\rtlswap.o \

            $(INTERMEDIATE)\lib\rtl\i386\rtlmem.o \

            $(INTERMEDIATE)\lib\rtl\i386\res_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\thread.o \

 

Using this order rtl will compile and ntoskrnl can be linked without problems but If the order is changed to ASMs on top (the order present in rtl.rbuild):

 

rtl_OBJS := \

            $(INTERMEDIATE)\lib\rtl\i386\debug_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\except_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\except.o \

            $(INTERMEDIATE)\lib\rtl\i386\random_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\rtlswap.o \

            $(INTERMEDIATE)\lib\rtl\i386\rtlmem.o \

            $(INTERMEDIATE)\lib\rtl\i386\res_asm.o \

            $(INTERMEDIATE)\lib\rtl\i386\thread.o \

            $(INTERMEDIATE)\lib\rtl\austin\avl.o \

            $(INTERMEDIATE)\lib\rtl\austin\tree.o \

            $(INTERMEDIATE)\lib\rtl\access.o \

            $(INTERMEDIATE)\lib\rtl\acl.o \

            $(INTERMEDIATE)\lib\rtl\atom.o \

            $(INTERMEDIATE)\lib\rtl\bitmap.o \

            $(INTERMEDIATE)\lib\rtl\bootdata.o \

            $(INTERMEDIATE)\lib\rtl\compress.o \

            $(INTERMEDIATE)\lib\rtl\condvar.o \

            $(INTERMEDIATE)\lib\rtl\crc32.o \

            $(INTERMEDIATE)\lib\rtl\critical.o \

            $(INTERMEDIATE)\lib\rtl\dbgbuffer.o \

            $(INTERMEDIATE)\lib\rtl\debug.o \

            $(INTERMEDIATE)\lib\rtl\dos8dot3.o \

            $(INTERMEDIATE)\lib\rtl\encode.o \

            $(INTERMEDIATE)\lib\rtl\env.o \

            $(INTERMEDIATE)\lib\rtl\error.o \

            $(INTERMEDIATE)\lib\rtl\exception.o \

            $(INTERMEDIATE)\lib\rtl\generictable.o \

            $(INTERMEDIATE)\lib\rtl\handle.o \

            $(INTERMEDIATE)\lib\rtl\heap.o \

            $(INTERMEDIATE)\lib\rtl\image.o \

            $(INTERMEDIATE)\lib\rtl\message.o \

            $(INTERMEDIATE)\lib\rtl\largeint.o \

            $(INTERMEDIATE)\lib\rtl\luid.o \

            $(INTERMEDIATE)\lib\rtl\network.o \

            $(INTERMEDIATE)\lib\rtl\nls.o \

            $(INTERMEDIATE)\lib\rtl\path.o \

            $(INTERMEDIATE)\lib\rtl\ppb.o \

            $(INTERMEDIATE)\lib\rtl\process.o \

            $(INTERMEDIATE)\lib\rtl\propvar.o \

            $(INTERMEDIATE)\lib\rtl\qsort.o \

            $(INTERMEDIATE)\lib\rtl\random.o \

            $(INTERMEDIATE)\lib\rtl\rangelist.o \

            $(INTERMEDIATE)\lib\rtl\registry.o \

            $(INTERMEDIATE)\lib\rtl\res.o \

            $(INTERMEDIATE)\lib\rtl\resource.o \

            $(INTERMEDIATE)\lib\rtl\sd.o \

            $(INTERMEDIATE)\lib\rtl\security.o \

            $(INTERMEDIATE)\lib\rtl\sid.o \

            $(INTERMEDIATE)\lib\rtl\sprintf.o \

            $(INTERMEDIATE)\lib\rtl\srw.o \

            $(INTERMEDIATE)\lib\rtl\swprintf.o \

            $(INTERMEDIATE)\lib\rtl\splaytree.o \

            $(INTERMEDIATE)\lib\rtl\thread.o \

            $(INTERMEDIATE)\lib\rtl\time.o \

            $(INTERMEDIATE)\lib\rtl\timezone.o \

            $(INTERMEDIATE)\lib\rtl\timerqueue.o \

            $(INTERMEDIATE)\lib\rtl\unicode.o \

            $(INTERMEDIATE)\lib\rtl\unicodeprefix.o \

            $(INTERMEDIATE)\lib\rtl\vectoreh.o \

            $(INTERMEDIATE)\lib\rtl\version.o \

            $(INTERMEDIATE)\lib\rtl\workitem.o \

 

[LD]       C:\Ros\clean\reactos\output-i386\ntoskrnl\ntoskrnl.exe

C:\Ros\clean\reactos\obj-i386\lib\rtl\rtl.a(random.o): In function `RtlUniform@4':

C:/Ros/clean/reactos/lib/rtl/random.c:137: multiple definition of `_RtlUniform@4'

C:\Ros\clean\reactos\obj-i386\lib\rtl\rtl.a(random_asm.o):C:\Ros\clean\reactos\lib\rtl\i386\random_asm.S:161: first defined here

C:\Ros\clean\reactos\obj-i386\lib\rtl\rtl.a(random.o): In function `RtlRandom@4':

C:/Ros/clean/reactos/lib/rtl/random.c:69: multiple definition of `_RtlRandom@4'

C:\Ros\clean\reactos\obj-i386\lib\rtl\rtl.a(random_asm.o):C:\Ros\clean\reactos\lib\rtl\i386\random_asm.S:23: first defined here

collect2: ld returned 1 exit status

mingw32-make: *** [C:\Ros\clean\reactos\output-i386\ntoskrnl\ntoskrnl.exe] Error 1

 

Total Build Time: 00:03:09

 

 

You will get linking errors , this error looks wired to me . In the rbuild generated file the .asm files generating this problem will be added to the end of the list because they are inside an If condition (ARCH=i386) so this żbug? does not appear even when exists

 

Am I missing something here? How can It be solved, any clues?