Page 2 of 2
Re: Printing strings problem
Posted: Thu Nov 12, 2009 9:56 am
by Grunt
I found out that breaking at a specified address works better for me. That led me to another thing. This code:
generates this:
Code: Select all
1007ba: 68 44 88 04 08 push $0x8048844
1007bf: 8d 45 d8 lea -0x28(%ebp),%eax
1007c2: 50 push %eax
1007c3: e8 de fe ff ff call 1006a6 <_ZN5Video4putsEPc>
Could this mean that it's trying to access unreachable memory?
Code: Select all
Breakpoint 1, 0x001007c3 in main ()
(gdb) info registers
eax 0x103fd8 1064920
ecx 0x1 1
edx 0x3cc 972
ebx 0x2dae0 187104
esp 0x103fb0 0x103fb0
ebp 0x104000 0x104000
esi 0x5480d 346125
edi 0x5480e 346126
eip 0x1007c3 0x1007c3 <main+55>
eflags 0x200016 [ PF AF ID ]
cs 0x8 8
ss 0x10 16
ds 0x10 16
es 0x10 16
fs 0x10 16
gs 0x10 16
(gdb) x $eax
0x103fd8 <bss+8144>: 0x08048828
Both the parameters passed to the function are wrong - first the hardcoded value, then the value in eax, which again points to a wrong address. What should I do in this case?
Re: Printing strings problem
Posted: Thu Nov 12, 2009 10:45 am
by smeezekitty
I had that problem, it means the linker does not know how to align your segments / offsets so its putting the string some where in memory but them reads it back from another location.
Re: Printing strings problem
Posted: Thu Nov 12, 2009 11:40 am
by Combuster
I blame your linker script - you have circular address dependencies (LS_Data), and you are not specifying the link address for all sections.
You can grab a working linker script from the
wiki - which has the same effect as yours probably intended to do.
Re: Printing strings problem
Posted: Thu Nov 12, 2009 11:54 pm
by Grunt
smeezekitty wrote:I had that problem, it means the linker does not know how to align your segments / offsets so its putting the string some where in memory but them reads it back from another location.
How did you fix it?
Here is an explanation, though it doesn't work for me. And for the last hour or so I keep modifying the linker script with no result.
Re: Printing strings problem
Posted: Fri Nov 13, 2009 1:55 am
by Solar
Combuster wrote:You can grab a working linker script from the
wiki - which has the same effect as yours probably intended to do.
If you ignore good advice given, at least give an indication why you're doing so. Otherwise one might get the impression that trying to help you is in vain...
Re: Printing strings problem
Posted: Fri Nov 13, 2009 2:40 am
by Grunt
Sorry... I forgot to mention that. I did try the linker script provided there. Here's what I also tried:
- .rodata as a separate section, and inside .text
- with/without AT() for each section
- with/without the 4KB alignment
Also took a look at some other sample linker scripts I found that could help me, but I found nothing.
I'm running out of ideas...
Re: Printing strings problem
Posted: Fri Nov 13, 2009 4:05 am
by Combuster
Since the linker script alone doesn't want to fix the problem, let's get back to the basics:
- OS and version
- Compiler + linker version
- All complete command lines and other operations used to build the final image.
Re: Printing strings problem
Posted: Fri Nov 13, 2009 6:42 am
by Solar
Grunt wrote:@gravaera, thank you for your tips. My putch() is the same as the one in
this example.
Including the global variables textmemptr, attrib, csr_x and csr_y? Including the supporting code? Did you initialize everything properly?
If you copy & paste other people's code, copy it
exactly and make sure it works
as-is, before starting to modify it.
Re: Printing strings problem
Posted: Fri Nov 13, 2009 9:44 am
by Grunt
Combuster wrote:- OS and version
- Compiler + linker version
- All complete command lines and other operations used to build the final image.
1. Windows XP Service Pack 3
2.
gcc 3.4.6
gdb 6.8
binutils 2.19.1 (all three cross-compiled to target i586-elf)
nasm 2.07
Code: Select all
F:\osII>gcc -v
Reading specs from /usr/cross/lib/gcc/i586-elf/3.4.6/specs
Configured with: ./configure --target=i586-elf --prefix=/usr/cross --disable-nls --enable-languages=c,c++ --without-headers
Thread model: single
gcc version 3.4.6
F:\osII>nasm -v
NASM version 2.07 compiled on Jul 19 2009
F:\osII>ld -v
GNU ld (GNU Binutils) 2.19.1
F:\osII>gdb -v
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-cygwin --target=i586-elf".
3.
Code: Select all
nasm -f elf32 loader.asm -o build/loader.o
set CFLAGS=-g -Wall -W -nostartfiles -nostdinc -nostdlib -fno-exceptions -fno-rtti -fno-builtin
set CINCLUDES=-I./include -I./include/kernel
g++ %CFLAGS% %CINCLUDES% -o build/main.o src/*.cpp
ld -T linker.ld -nostdlib -o build/kernel.bin
cd build
objdump --source -D -S -s kernel.bin > kernel.lst
This is how the linker script looks right now.
Solar: yes. I'm pretty certain the code is correct, because I can print single characters. The problem is because at runtime, the address of the string is not correct (it should be 0x100845). Perhaps a bug with GCC? I'll crosscompile a 4.4.x version soon, let's see if that works.
Thank you.
Re: Printing strings problem
Posted: Sat Nov 14, 2009 10:16 am
by Grunt
No, that didn't work... I don't know what else to do.
When building with Cygwin, or MinGW, this doesn't happen. I tried with geezer's
example.
100102: b9 00 10 10 00 mov $0x101000,%ecx
// ..............
10012e: e8 5d ff ff ff call 0x100090
100133: 89 1c 24 mov %ebx,(%esp)
100136: ba 40 00 00 00 mov $0x40,%edx
10013b: b8 40 10 10 00 mov $0x101040,%eax
100140: 89 54 24 08 mov %edx,0x8(%esp)
100144: 89 44 24 04 mov %eax,0x4(%esp)
100148: e8 43 ff ff ff call 0x100090
100121: 68 40 81 04 08 push $0x8048140
100126: ff 75 fc pushl -0x4(%ebp)
100129: e8 65 ff ff ff call 100093 <memcpy>
// ..............
100133: 68 80 81 04 08 push $0x8048180
100138: 8b 45 fc mov -0x4(%ebp),%eax
10013b: 05 a0 00 00 00 add $0xa0,%eax
100140: 50 push %eax
100141: e8 4d ff ff ff call 100093 <memcpy>
That's the generated code from MinGW (first example) and my cross-compiler (second example). You see that the addresses of the two strings are different. It's a problem with the cross-compiler/linker... I'm pretty sure of it, but I don't know how to fix it.
Re: Printing strings problem
Posted: Mon Nov 16, 2009 2:42 pm
by Grunt
I found the problem. Finally.
Adding -c to the compiler flags fixes it. (In case someone else will have the same problem)
Re: Printing strings problem
Posted: Mon Nov 16, 2009 3:56 pm
by gravaera
Hi:
I don't mean to bash, but:
This forum holds to a certain
prerequisite base of knowledge before you ask questions. The wiki states that you are assumed to both know and understand thoroughly your development toolchain. Before you begin developing an OS, a certain level of 'programmer wisdom' should have been attained to. If you don't understand the basics of compiling relocatable object files for linkage, do you really think you can take proper advantage of your compiler, linker, or any other tool in your arsenal?
Please revise your stance and make a firm resolve to do better...
-All the best
gravaera
Re: Printing strings problem
Posted: Mon Nov 16, 2009 11:42 pm
by Solar
Grunt wrote:Adding -c to the compiler flags fixes it.
Pray tell, how many hoops did you have to jump through to make your stuff compile without error message regardless whether you give a -c or not?
I tried, but couldn't do it.
Oh, and your post is missing a central element:
Sorry for wasting everybody's time, I've been stupid.
The rule #1 of debugging (given to you for free because it's Tuesday).
1) Make a copy of your source tree.
2) Cut away everything not directly related to your problem.
3) Cut away everything you could cut away and still reproduce the problem.
4) Make sure there is positively nothing you could yet cut away while still reproducing the problem.
5) Post
everything left over, explaining (in clear words) what result you expected and what you got instead (copy & paste error messages!).
5a) If you feel that would be too much to post on a forum, repeat 2) through 4).
The people you are asking for help should be able to compile the code you posted using the tools and command line options you posted and reproduce the problem on
their machines.
Usually the problem resolves itself automatically somewhere between 2) and 5). If not, people can toy with your source and command lines themselves instead of playing "20 questions" with you.
This is not condescending flaming, this is the rule #1 of debugging.