On Fri, 11 Nov 2005, Pavan T C wrote:
yeah, am using an ADSP blackfin processor here, got a gcc port for that... and no shared objects...
I'm interested in creating an executable that can be loaded at an address that I specify... looked at the --entry option in ld, that changed the entry address, but a readelf of the executable shows the section addresses have not changed...
For example, if you create an exe on your PC gcc and have a look and the disassembled output, you see that the start address is always 0x8048244, and that the other sections have addresses wrt to this start address.
Not so in my case.. I see the start address change, but not the section addrs.
In my case, I can use the --section-start <section name> <my addr> option to ld and specify addresses of my sections, but there has to be an easier way... maybe I have to specify somewhere that I want absolute code or
something...
Hi all,
One better way to do it is to use a mapfile for the linker.
I dont think the relocatable objects are the defaults when you compile. On solaris (I dont have a linux box here), i need to use ld -r to specify that I need a relocatable object/exe. To verify that, I did a gcc -c and then used objdump -d to check the addresses and they were all relative to zero.
which implies that what goes into ld has to be relocatable...
To see what gcc is using to build you executable, use gcc -v.
That should give you a fair idea of what you should override by passing the linker options via gcc in the command line to get what you want.
I'll see if I can play around with the linker during the weekend.
Anyways , I managed to get what I wanted,here's my code: blink.c: -------- #include "cdefBF532.h"
void blink() { int i; *pFIO_DIR = 0x2; while(1) { *pFIO_FLAG_T = 0x2; for(i=0; i<200000000; i++) continue; } }
main.c: ------- int main() { blink(); return 0; }
command line:
gcc -fno-builtin -ffreestanding -nostdinc -c blink.c gcc -fno-builtin -ffreestanding -nostdinc -c main.c ld -Bstatic -Ttext 0xffa08000 -o bld blink.o main.o -Map blink.map
...and here is my disassembled executable: (objdump -d -r bld) (Caution: The mnemonics are for the Blackfin DSP) bld: file format elf32-bfin
Disassembly of section .text:
ffa08000 <_blink>: ffa08000: 00 e8 01 00 LINK 0x4; ffa08004: 4a e1 c0 ff P2.H=ffc0 <_blink-0xff9f8040>; ffa08008: 0a e1 30 07 P2.L=730 <_blink-0xffa078d0>; ffa0800c: 10 60 R0=0x2(x); ffa0800e: 10 97 W[P2]=R0; ffa08010: 4a e1 c0 ff P2.H=ffc0 <_blink-0xff9f8040>; ffa08014: 0a e1 0c 07 P2.L=70c <_blink-0xffa078f4>; ffa08018: 10 60 R0=0x2(x); ffa0801a: 10 97 W[P2]=R0; ffa0801c: 00 60 R0=0x0(x); ffa0801e: f0 bb [FP-4]=R0; ffa08020: f0 b9 R0=[FP-4]; ffa08022: 41 e1 eb 0b R1.H=0xbeb; ffa08026: 01 e1 ff c1 R1.L=-15873; ffa0802a: 08 09 CC=R0<=R1; ffa0802c: f2 13 IF ! CC JUMP ffa08010 <_blink+0x10>; ffa0802e: f0 b9 R0=[FP-4]; ffa08030: 08 64 R0+=0x1; ffa08032: f0 bb [FP-4]=R0; ffa08034: f6 2f JUMP.S ffa08020 <_blink+0x20>; ... ffa08038 <_main>: ffa08038: 00 e8 03 00 LINK 0xc; ffa0803c: ff e3 e2 ff CALL ffa08000 <_blink>; ffa08040: 00 60 R0=0x0(x); ffa08042: 01 e8 00 00 UNLINK; ffa08046: 10 00 RTS;
Also, here's the 'readelf -a bld' output: (See comments inline)
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: <unknown>: 6a Version: 0x1 Entry point address: 0xffa08000 ^^^^^^^^^^^^^^^^^^^^ // I Think I need to change this to point to main // starting (see symtab) 0xffa08038 Start of program headers: 52 (bytes into file) Start of section headers: 4264 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 2 Size of section headers: 40 (bytes) Number of section headers: 9 Section header string table index: 6
Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS ffa08000 001000 000048 00 AX 0 0 4 [ 2] .data PROGBITS ffa09048 001048 000000 00 WA 0 0 4 [ 3] .sbss PROGBITS ffa09048 001048 000000 00 W 0 0 1 [ 4] .bss NOBITS ffa09048 001048 000000 00 WA 0 0 4 [ 5] .comment PROGBITS 00000000 001048 000024 00 0 0 1 [ 6] .shstrtab STRTAB 00000000 00106c 00003b 00 0 0 1 [ 7] .symtab SYMTAB 00000000 001210 000100 10 8 b 4 [ 8] .strtab STRTAB 00000000 001310 000035 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific)
Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x001000 0xffa08000 0xffa08000 0x00048 0x00048 R E 0x1000 LOAD 0x001048 0xffa09048 0xffa09048 0x00000 0x00000 RW 0x1000 ^^^^^^^^^^^^^^ // What is this second load address??
Section to Segment mapping: Segment Sections... 00 .text 01
There is no dynamic segment in this file.
There are no relocations in this file.
There are no unwind sections in this file.
Symbol table '.symtab' contains 16 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: ffa08000 0 SECTION LOCAL DEFAULT 1 2: ffa09048 0 SECTION LOCAL DEFAULT 2 3: ffa09048 0 SECTION LOCAL DEFAULT 3 4: ffa09048 0 SECTION LOCAL DEFAULT 4 5: 00000000 0 SECTION LOCAL DEFAULT 5 6: 00000000 0 SECTION LOCAL DEFAULT 6 7: 00000000 0 SECTION LOCAL DEFAULT 7 8: 00000000 0 SECTION LOCAL DEFAULT 8 9: 00000000 0 FILE LOCAL DEFAULT ABS blink.c 10: 00000000 0 FILE LOCAL DEFAULT ABS main.c 11: ffa08000 54 FUNC GLOBAL DEFAULT 1 _blink 12: ffa09048 0 NOTYPE GLOBAL DEFAULT ABS __bss_start 13: ffa09048 0 NOTYPE GLOBAL DEFAULT ABS _edata 14: ffa09048 0 NOTYPE GLOBAL DEFAULT ABS _end 15: ffa08038 16 FUNC GLOBAL DEFAULT 1 _main
No version information found in this file.
.. or maybe I have to get position-independent-code and then just specify the start address ?
I dont know how that will work when you have multiple objects being linked. I feel it is better to go with the default placement and use the mapfile to tweak what is impt for you.
-- P