Forum Discussion
Altera_Forum
Honored Contributor
14 years agounable to link an executable image
Hi,
I'm jus triying to compile and link a simple "hello world" application with gcc nios2-linux-gnu-gcc (version 4.1.2) but gcc does not reconize -elf2flt parameter as we can see in the compiler output: jordi@debian:$ nios2-linux-gnu-gcc hello.c -o hello.exe -elf2flt/home/jordi/projects/vdm-1/system/current/nios2-linux/toolchain-mmu/x86-linux2/bin/../lib/gcc/nios2-linux-gnu/4.1.2/../../../../nios2-linux-gnu/bin/ld: warning: cannot find entry symbol lf2flt; defaulting to 0000137c
The output file remains in elf format instead of desired flat. please help, I'm realy stuck at this point :( thanks
12 Replies
- Altera_Forum
Honored Contributor
You need to use objcopy to convert the file format.
- Altera_Forum
Honored Contributor
thanks dsl
I've tried $nios2-linux-gnu-objcopy -i srec hello -o binary hello.exe -s And I've got hello.exe file that heads with: 00000000 2F6C 6962 2F6C 642E 736F 2E31 0000 0000 /lib/ld.so.1.... 00000010 0400 0000 1000 0000 0100 0000 474E 5500 ............GNU. 00000020 0000 0000 0200 0000 0600 0000 1500 0000 ................ 00000030 0300 0000 0800 0000 0700 0000 0600 0000 ............... ..... It doesn't seem a binary flat executable file. So where is the trick ? Did I a mistake using objcopy ? thanks - Altera_Forum
Honored Contributor
You've told objcopy the input file is 'S-records' - not surprising it doesn't DTRT!
Your elf file probably contains multiple sections (depending on what is in the linker script) that get loaded to different addresses. You'll need to extract these separately. 'objdump -p' will list the program sections (which are the ones you probably want), use the -j parameter to objcopy to select the section. - Altera_Forum
Honored Contributor
thanks dsl
I found that a little complicated. I think, I've better to use an older toolchain (gcc version 3.4.6) that accept -elf2flt parameter. I run nios2-linux-gnu-gcc hello.c -o hello2 -elf2flt and it works. I wonder why gcc 4.1.2 doesn't accept that. thanks - Altera_Forum
Honored Contributor
I can't see where gcc 3.4.6 supports it, the copy I have doesn't.
Possibly something is using that parameter to set the OUTPUT_FORMAT outside the linker script - but I can't see a command line parameter to ld that would do that. For flexibility (and to know what is actually being done) it is best to run objcopy yourself. - Altera_Forum
Honored Contributor
OK dsl
I'll follow this way Thankyou - Altera_Forum
Honored Contributor
--- Quote Start --- thanks dsl I found that a little complicated. I think, I've better to use an older toolchain (gcc version 3.4.6) that accept -elf2flt parameter. I run nios2-linux-gnu-gcc hello.c -o hello2 -elf2flt and it works. I wonder why gcc 4.1.2 doesn't accept that. thanks --- Quote End --- Hi, I am experiencing same problem.. I see that you have switch to older version of GCC. could you give me some instruction how safely remove the GCC and install the older one?.. I have tried this before but was not able to.. Sorry I have still much to learn in this linux - Altera_Forum
Honored Contributor
Hi, Lanzones
I finally opted for using and old uClinux distribution (Linux version 2.6.19-uc1 from www.uclinux.org) and using also an old toolchain gcc version 3.4.6. You can get the tool from http://www.alterawiki.com/wiki/binarytoolchain you can decompress the archive http://www.niosftp.com/pub/gnutools/nios2gcc-20080203.tar.bz2 in any place you wish (i.e /opt/nios2-toolchain) You have to put in the 'path' the path to binaries in your bashrc file i.e: PATH_TOOLCHAIN_NIOS2=/opt/nios2-toolchain/build_nios2/staging_dir/bin/ PATH=$PATH:$PATH_TOOLCHAIN_NIOS2 export PATH to compile my old version of linux I have to do something like this: M_ARCH=nios2nommu M_SYSPTF=$M_DIR_BASE/ptf/NIOS.ptf # toolchain (builroot) M_TOOLCHAIN=/opt/nios2-toolchain/build_nios2/staging_dir/bin/nios2-linux- # hardware assign make ARCH=${M_ARCH} CROSS_COMPILE=${M_TOOLCHAIN} vendor_hwselect SYSPTF=${M_SYSPTF} # compile make ARCH=${M_ARCH} CROSS_COMPILE=${M_TOOLCHAIN} This is valid for old uClinux dist so you will have to tune for your distribution. good luck - Altera_Forum
Honored Contributor
Thanks jofasa,
got it... with this solution, the elf2flt function will work properly.I try to do the DEBUG Apps " nios2-linux-uclibc-gcc -g hello.c -o hello -elf2flt" again and it should work this time.. do you think this is also the reason why I couldnt run properly the make gcc elf2flt gdb-host on building the toolchain? some clarification.. ALL of below should be all in my .bash_profile.. correct? /******************************* PATH_TOOLCHAIN_NIOS2=/opt/nios2-toolchain/build_nios2/staging_dir/bin/ PATH=$PATH:$PATH_TOOLCHAIN_NIOS2 export PATH M_ARCH=nios2nommu M_SYSPTF=$M_DIR_BASE/ptf/NIOS.ptf M_TOOLCHAIN=/opt/nios2-toolchain/build_nios2/staging_dir/bin/nios2-linux- make ARCH=${M_ARCH} CROSS_COMPILE=${M_TOOLCHAIN} vendor_hwselect SYSPTF=${M_SYSPTF} make ARCH=${M_ARCH} CROSS_COMPILE=${M_TOOLCHAIN} - Altera_Forum
Honored Contributor
Hi Lanzones
In .bashrc you have to put only the path to binaries toolchain all the rest is just a script stuff to compile the kernel. You have to keep on mind the toolchain prefix, in my case is "nios2-linux-", so the compiler call is nios2-linux-gcc. In your case it seems to be "nios2-linux-uclibc-". We have different toolchains, so you should modify the path I give you as exemple in order to have correct binaries path in your toolchain.