The following documentation discusses the procedures for using the main utilities for the UNIX operating systems.
1. Create source code
Create the following sample source code and save it as hello.c. Use this program to verify correct installation.
#include <stdio.h>
int a, c;
void foo(int b)
{
c = a + b;
printf("%d + %d = %d\n", a, b, c);
}
int main()
{
int b;
a = 3;
b = 4;
printf("Hello, world!\n");
foo(b);
return 0;
}
2. Compile and link from source code
Throughout these examples the bold percent sign (%) represents the operating system command prompt.
The stand-alone simulator can work with both big-endian and little-endian executables. The DDB evaluation board requires a little-endian executable. For the following examples compile a little-endian executable named hello.xl.
To compile and link this example enter:
% gcc -g -EL hello.c -Tddb.ld
-o hello.xl
%
To compile a little-endian
executable use the -EL
option to GCC. The option
-g
generates debugging information, and -o
specifies the name of the executable to be produced. Other useful options
include -O
for standard optimization, and -O2
for extensive optimization. When no optimization option is used GCC will
not optimize.
To link an executable, the correct linker script must be specified with the -T option. To link for the DDB (PMON) board, use -Tddb.ld. To link for a different PMON board use -Tpmon.ld.
3. Run the executable on the stand-alone simulator
To run this program on the stand-alone simulator, enter:
% mips64vr4300-elf-run
hello.xl
hello world!
3 + 4 = 7
%
The simulator executes the program, and returns when the program exits.
4. Run under the debugger
GDB can be used to debug executables either on hardware via serial or ethernet download or using the GNUpro MIPS simulator. Debugging on hardware does not support doing ethernet and serial downloads concurrently. It is recommended that ethernet downloads are done on a private network. Ethernet traffic on a typical LAN can cause problems downloading software to the card.
4a. Debug with serial download
To run this executable on the DDB board, under the GNU debugger GDB, enter:
% mips64vr4300-elf-gdb -nw hello.xl GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.16-nec-960902 (sparc-sun-sunos4.1.4 --target mips64vr4300-elf), Copyright 1996 Free Software Foundation, Inc. (gdb) target ddb /dev/ttya Remote MIPS debugging using /dev/ttya Current language: auto; currently asm (gdb) load .text : 0xa0100000 .. 0xa01069c0 .rodata : 0xa01069c0 .. 0xa0106df0 .reginfo: 0xa0106df0 .. 0xa0106e08 .data : 0xa0107380 .. 0xa01079d0 .lit8 : 0xa01079d0 .. 0xa0107a60 .sdata : 0xa0107a60 .. 0xa0107b00 (gdb) break main Breakpoint 1 at 0xa01001b0: file hello.c, line 15. (gdb) run Starting program: /tmp/hello.xl Breakpoint 1, main () at hello.c:15 15 a = 3; Current language: auto; currently c (gdb) print a $1 = 0 (gdb) step 16 b = 4; (gdb) print a $2 = 3 (gdb) list 11 int main() 12 { 13 int b; 14 15 a = 3; 16 b = 4; 17 printf("Hello, world!\n"); 18 foo(b); 19 return 0; 20 } (gdb) list foo 1 #include <stdio.h> 2 3 int a, c; 4 5 void foo(int b) 6 { 7 c = a + b; 8 printf("%d + %d = %d\n", a, b, c); 9 } 10 (gdb) break 7 Breakpoint 2 at 0xa0100144: file hello.c, line 7. (gdb) continue Continuing. Hello, world! Breakpoint 2, foo (b=4) at hello.c:7 7 c = a + b; (gdb) step 8 printf("%d + %d = %d\n", a, b, c); (gdb) print c $3 = 7 (gdb) next 3 + 4 = 7 9 } (gdb) backtrace #0 foo (b=4) at hello.c:9 #1 0xa01001e0 in main () at hello.c:18 #2 0xa01058f8 in __do_main () at ../../../../../libgloss/mips/../do_main.c:12 (gdb) quit %
The -nw option in the original call to gdb selected the command line interface to the GDB (GNU debugger), which is useful for making transcripts such as the one above. The -nw option is also useful when you wish to report a bug in GDB, because a sequence of commands is simpler to reproduce. If you are running an X11 based server and your DISPLAY environment variable is set, GDB will start the GNUPro gdbtk interface by default.
4b. Debug with ethernet download
To run this executable on the DDB board, under the GNU debugger GDB, using ethernet download enter:
% mips64vr4300-elf-gdb -nw hello.xl GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.16-nec-960902 (sparc-sun-sunos4.1.4 --target mips64vr4300-elf), Copyright 1996 Free Software Foundation, Inc. (gdb) target ddb /dev/ttya 192.168.1.1:/tmp/hello.tmp Remote MIPS debugging using /dev/ttya Current language: auto; currently asm (gdb) load .text : 0xa0100000 .. 0xa01069c0 .rodata : 0xa01069c0 .. 0xa0106df0 .reginfo: 0xa0106df0 .. 0xa0106e08 .data : 0xa0107380 .. 0xa01079d0 .lit8 : 0xa01079d0 .. 0xa0107a60 .sdata : 0xa0107a60 .. 0xa0107b00 (gdb) break main Breakpoint 1 at 0xa01001b0: file hello.c, line 15. (gdb) run Starting program: /tmp/hello.xl Breakpoint 1, main () at hello.c:15 15 a = 3; Current language: auto; currently c (gdb) print a $1 = 0 (gdb) step 16 b = 4; (gdb) print a $2 = 3 (gdb) list 11 int main() 12 { 13 int b; 14 15 a = 3; 16 b = 4; 17 printf("Hello, world!\n"); 18 foo(b); 19 return 0; 20 } (gdb) list foo 1 #include <stdio.h> 2 3 int a, c; 4 5 void foo(int b) 6 { 7 c = a + b; 8 printf("%d + %d = %d\n", a, b, c); 9 } 10 (gdb) break 7 Breakpoint 2 at 0xa0100144: file hello.c, line 7. (gdb) continue Continuing. Hello, world! Breakpoint 2, foo (b=4) at hello.c:7 7 c = a + b; (gdb) step 8 printf("%d + %d = %d\n", a, b, c); (gdb) print c $3 = 7 (gdb) next 3 + 4 = 7 9 } (gdb) backtrace #0 foo (b=4) at hello.c:9 #1 0xa01001e0 in main () at hello.c:18 #2 0xa01058f8 in __do_main () at ../../../../../libgloss/mips/../do_main.c:12 (gdb) quit %
The
-nw
option selects the command line interface to the GDB (GNU debugger), which
is useful for making transcripts such as the one above. The
-nw
option is also useful when you wish to report a bug in GDB, because a sequence
of commands is simpler to reproduce. If you are running an X11 based server
and your DISPLAY
environment variable is set, GDB will start the GNUPro gdbtk
interface by default.
4c. Debug with the built-in simulator
To run this executable under the GNU debugger GDB, on the built-in simulator enter:
% mips64vr4300-elf-gdb -nw hello.xl GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.16-nec-960902 (sparc-sun-sunos4.1.4 --target mips64vr4300-elf), Copyright 1996 Free Software Foundation, Inc. (gdb) target sim Remote MIPS debugging using /dev/ttya Current language: auto; currently asm (gdb) load .text : 0xa0100000 .. 0xa01069c0 .rodata : 0xa01069c0 .. 0xa0106df0 .reginfo: 0xa0106df0 .. 0xa0106e08 .data : 0xa0107380 .. 0xa01079d0 .lit8 : 0xa01079d0 .. 0xa0107a60 .sdata : 0xa0107a60 .. 0xa0107b00 (gdb) break main Breakpoint 1 at 0xa01001b0: file hello.c, line 15. (gdb) run Starting program: /tmp/hello.xl Breakpoint 1, main () at hello.c:15 15 a = 3; Current language: auto; currently c (gdb) print a $1 = 0 (gdb) step 16 b = 4; (gdb) print a $2 = 3 (gdb) list 11 int main() 12 { 13 int b; 14 15 a = 3; 16 b = 4; 17 printf("Hello, world!\n"); 18 foo(b); 19 return 0; 20 } (gdb) list foo 1 #include <stdio.h> 2 3 int a, c; 4 5 void foo(int b) 6 { 7 c = a + b; 8 printf("%d + %d = %d\n", a, b, c); 9 } 10 (gdb) break 7 Breakpoint 2 at 0xa0100144: file hello.c, line 7. (gdb) continue Continuing. Hello, world! Breakpoint 2, foo (b=4) at hello.c:7 7 c = a + b; (gdb) step 8 printf("%d + %d = %d\n", a, b, c); (gdb) print c $3 = 7 (gdb) next 3 + 4 = 7 9 } (gdb) backtrace #0 foo (b=4) at hello.c:9 #1 0xa01001e0 in main () at hello.c:18 #2 0xa01058f8 in __do_main () at ../../../../../libgloss/mips/../do_main.c:12 (gdb) quit %
The
-nw
option selects the command line interface to the GDB (GNU debugger), which
is useful for making transcripts such as the one above. The
-nw
option is also useful when you wish to report a bug in GDB, because a sequence
of commands is simpler to reproduce. If you are running an X11 based server
and your DISPLAY
environment variable is set, GDB will start the GNUPro gdbtk
interface by default.
5. Assembler listing from source code
The following command produces an assembler listing:
% mips64vr4300-elf-gcc -g -O2 -Wa,-alh,-L -c hello.c
The assembler option -alh requests a listing with high-level language and assembler language interspersed, -L preserves local labels, while the compiler debugging option -g gives the assembler the necessary debugging information. The -O2 option produces better looking code output.
Here is a partial excerpt of the output. In the following listing, the source lines are shown by **** .The .stabn lines are part of symbolic debugging information, and you may ignore them.
14:hello.c **** 15:hello.c **** a = 3; 130 .stabn 68,0,15,$LM8 131 0044 24020003 li $2,3 # 0x00000003 132 $LM9: 16:hello.c **** b = 4; 17:hello.c **** printf("Hello, world!\n"); 133 .stabn 68,0,17,$LM9 134 0048 3C040000 lui $4,%hi($LC1) # high 135 $LM10: 136 .stabn 68,0,15,$LM10 137 004c AF820000 sw $2,a 138 $LM11: 139 .stabn 68,0,17,$LM11 140 .set noreorder 141 .set nomacro 142 0050 0C000000 jal printf 143 0054 24840010 addiu $4,$4,%lo($LC1) # low 144 .set macro 145 .set reorder 146