Linker problems with arm-wince, need help/info

Chad J "gamerChad\" at spamIsBad gmail.com
Sun Jun 18 09:20:07 PDT 2006


pedro alves wrote:
>> Then I noticed where the crt0.S file that made that crt0.o file came 
>> from, and I found that in the cegcc-0.0.3 sources and tried to 
>> assemble that, but the assembler gave me an error:
>>
>> crt0.S: Assembler messages:
>> crt0.S:24: Error: bad instruction `func_start __EH_HANDLER__'
>>
> The 'S' (uppercase) suffix means the file should be preprocessed before 
> being assembled. func_start is a macro.

Ah, good to know.

> 
>> hmmm, so I changed that line to what it was in my startfile.  Then it 
>> assembled fine, but when I used this new startfile I get the following 
>> errors:
>>
>> /tmp/ccCPaYXV.o:main.d:(.text+0x44): undefined reference to 
>> `_D3std4file5writeFAaAvZv'
>> /tmp/ccCPaYXV.o:main.d:(.text+0x8c): undefined reference to 
>> `_Dmodule_ref'
>> /tmp/ccCPaYXV.o:main.d:(.data+0x40): undefined reference to 
>> `_ModuleInfo_3std4file'
>> /usr/local/arm-wince-pe/lib/gcc/arm-wince-pe/4.0.3/../../../../arm-wince-pe/lib/crt0.o:: 
>> undefined reference to `__set_runtime_thread_mode'
>> /usr/local/arm-wince-pe/lib/gcc/arm-wince-pe/4.0.3/../../../../arm-wince-pe/lib/crt0.o:: 
>> undefined reference to `main'
>>
> 
>> Since the spec file seems to override the builtin stuff, I tried 
>> removing -fno-leading-underscore from my specfile to see what would 
>> happen, and it gives many more errors on compilation.  I'm guessing 
>> the -fno-leading-underscore is fairly essential, or the resultant 
>> programs wouldn't be able to do essential things like talk to the 
>> WinCE OS/API, whose name manglings would have different underscoring.
>>
> "on compilation"? You mean on linking, right?

Right.

> 
> Ok. looks like those D function calls are somehow being emitted with an 
> underscore.
> Who inserts the unscore in _D3std4file5writeFAaAvZv? Is it the D 
> mangling that requires it?
> Or could it be that the -fno-leading-underscore is being ignored by the 
> D frontend?
> 
> Are you really sure these functions are defined?

In an earlier post David asked me to run nm libgphobos.a, and I gave a 
link to that result.  I'm not sure how to read it so you can check for 
yourself.
Anyhow least a couple of the D ones seem to be defined in GPhobos.  I 
wonder if they are supposed to be found in the startfile though.  The 
leading underscore seems more likely.  I wonder though, was linking 
required to archive gphobos, or is that linking done when the executable 
is generated?  I ask because that would explain why it was able to 
"link" gphobos, but can not handle the D function calls in my simple 
program.

> Isn't your 'main' being D mangled? I don't almost nothing D, just an 
> observer, but, isn't there an extern "C" equivalent required
> around your main function? I guess there will be an extern "C" main that 
> initializes  phobos and then calls a _Dmain, or whatever.
> Where is this extern "C" main?

Putting extern(C) infront of main is not required.  I think there should 
be a second main though, with C linkage, that will do all of the setup 
for D, then call the main with D linkage.  I could be wrong though.  At 
any rate, I think there is a lot of startup code that should be there 
but isn't.  Stuff that would call all of the module ctors.

> 
> In recent cegcc, there is a default main in -lc that ld sucks in if the 
> the app doesn't define one. In Mamaich's toolchain, it is the other way 
> around, a default WinMain would call main.
> I don't get why that isn't being found by ld. Did you build that cdllimp 
> with gcc4, or is it exactly the same from Mamaich? That would be 
> problematic, since
> it was built against gcc 3.x.

I am using the one from Mamaich.  I guess this means I need to rebuild 
newlib?

> 
>> Concerning a somewhat unrelated problem, I wonder if there is a way to 
>> make something happen without an external specfile, that is, build it 
>> into the compiler:  I want it to include fixincl.h, but only for C and 
>> C plus plus compilation.  I tried putting this in 
>> TARGET_LIBGCC2_CFLAGS, but that messes up assembly :)
>> The reason I ask is this would save a nasty hack I have to do.  As it 
>> is, the make of gcc/gdc will fail when it gets to phobos because it 
>> tries to compile C files for arm-wince, but since it lacks the correct 
>> include info it fails.  So I made a dummy compiler that calls the real 
>> compiler and tells it to include fixincl.h.  Once make fails at 
>> phobos, I have to repeatedly replace xgcc with my own xgcc until the 
>> thing works (some motor skills and not-too-fast computer required!).
>>   
> What are the contents of this fixincl.h? Doesn't phobos have something 
> like a config.h where you can make this changes?
> 
> To be able to include wince sdk files with gcc I use a scheme of:
> --- windows.h
> 
> #include "fixincl.h"
> #include_next <windows.h>
> 
> ----
> 
> I guess the fixincl.h name in this case is just a coincidence :)

Probably just a coincidence, though I wouldn't be suprised if they are 
the same file.  I got my fixincl.h from Mamaich, it seems to just 
#define away a lot of the microsoft compiler features.  What you posted 
here looks like a much cleaner solution than making sure the include is 
passed to the preprocessor.

> 
> Cheers,
> Pedro Alves



More information about the D.gnu mailing list