This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Inserting labels before and after my program's global variables


[Sorry!  Meant to send this to the list, not just to Ian!]

On Dec 17, 2010, at 11:36 AM, Ian Lance Taylor wrote:

> Amittai Aviram <amittai.aviram@yale.edu> writes:
> 
>> Thank you very much!  But I just tried linking with the -v option, and
>> the output looks as if the linker does in fact put head.o immediately
>> before hello.o and tail.o immediately after it.  (Output below.  The
>> relevant bit is near the bottom.)  Why doesn't that give me the
>> results I was expecting in the finished executable binary?
> 
> I don't know, you would have to provide more details about exactly what
> input you used, what you expected to see, exactly what you saw, and why
> you expected it to be different.
> 
> One specific issue is that common symbols don't match your scheme, since
> they are not defined in the .bss section in a .o file but are placed
> there later by the linker.
> 
> Ian

On Dec 17, 2010, at 11:36 AM, Ian Lance Taylor wrote:

> Amittai Aviram <amittai.aviram@yale.edu> writes:
> 
>> Thank you very much!  But I just tried linking with the -v option, and
>> the output looks as if the linker does in fact put head.o immediately
>> before hello.o and tail.o immediately after it.  (Output below.  The
>> relevant bit is near the bottom.)  Why doesn't that give me the
>> results I was expecting in the finished executable binary?
> 
> I don't know, you would have to provide more details about exactly what
> input you used, what you expected to see, exactly what you saw, and why
> you expected it to be different.
> 
> One specific issue is that common symbols don't match your scheme, since
> they are not defined in the .bss section in a .o file but are placed
> there later by the linker.
> 
> Ian

I start with three source code files, head.s, hello.c, and tail.s.  Here is their source code in that order.

// head.s

       .section        .rodata
       .globl my_data_start
my_data_start:
       .section        .bss
       .global my_bss_start
my_bss_start:

// end head.s

// hello.c

#include <stdio.h>
#include <stdlib.h>

int global_a, global_b;

int main(void) {
       global_a = 3;
       global_b = 4;
       printf("Hello! %d %d\n", global_a, global_b);
       return EXIT_SUCCESS;
}

// end hello.c

// tail.s

      .section        .bss
       .globl my_bss_end
my_bss_end:

// end tail.s

And here is my Makefile:

all: l1

l1: head.o hello.o tail.o
       gcc -Wall -static -g -v -o $@ $^

head.o: head.s
       gcc -c -o $@ $<

tail.o: tail.s
       gcc -c -o $@ $<

hello.o: hello.c
       gcc -c -o $@ $<

clean:
       rm -f l1 *.o


Here is what I was expecting to see in the output from objdump -D l1, somewhere after "Disassembly of section .bss" (where the three dots actually appear in the output, but any [text] is my shorthand notation):

[Some address] <my_data_start>:
	...
[Next address 1] <global_b>:
 [Next address 1]:       00 00                   add    %al,(%rax)
	...

[Next address 2] <global_a>:
 [Next address 2]:       00 00                   add    %al,(%rax)
	...
[Next address 3] <my_data_end>:
	...

But here is what I get instead:

Disassembly of section .bss:

00000000006a1cc0 <completed.6885>:
       ...

00000000006a1cc8 <dtor_idx.6887>:
       ...

00000000006a1ce0 <object.6911>:
       ...

00000000006a1d10 <my_bss_end>:
       ...

00000000006a1d20 <static_dtv>:
       ...

00000000006a2120 <static_slotinfo>:
       ...
[... snip ...]

00000000006a49e0 <frame_hdr_cache_head>:
       ...

00000000006a49e8 <global_b>:
 6a49e8:       00 00                   add    %al,(%rax)
	...

00000000006a49ec <global_a>:
 6a49ec:       00 00                   add    %al,(%rax)
       ...

00000000006a49f0 <_dl_tls_static_used>:
       ...
[...snip...]


So note two things:

(a) my_data_start is missing, only my_data_end appears.  (If, however, I only include head.o in my Makefile,rule, then my_data_start appears in the location where my_data_end appears in the above extract.)

(b)  my_data_end is separated from global_a and global_b and seems to be in an arbitrary location in relation to them.

Thanks!


Amittai


Amittai Aviram
PhD Student in Computer Science
Yale University
646 483 2639
amittai.aviram@yale.edu
http://www.amittai.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]