How define absolute local symbol by GNU as?

Bob Plantz plantz@cds1.net
Thu Jul 7 16:30:00 GMT 2011


On 07/07/2011 07:40 AM, Oleksandr Gavenko wrote:
> On 07.07.2011 17:25, Andreas Schwab wrote:
>> Oleksandr Gavenko<gavenko@bifit.com.ua>  writes:
>>
>>> But how declare it local?
>>
>> Don't declare it global.
>>
> OK, but how?
>
> If I write:
>
>    .global @feat.00
>     @feat.00=1
>
> I get:
>
>   $ nm test.obj | grep feat
> 00000001 A @feat.00
>
> If I write:
>
>    /* .global @feat.00 */
>     @feat.00=1
>
> I get:
>
>   $ nm test.obj | grep feat
> <empty>
>
> So I expect existence of some directive to get wanted.
One suggestion is to write what you want in C, then use gcc's -S option 
to produce the assembly language, and look to see how gcc does it. For 
example,
int y = 456;

int func() {
     static int x = 123;
     x = x + 1;
     y = y + 1;
     return x + y;
}

gives

     .file    "static.c"
.globl y
     .data
     .align 4
     .type    y, @object
     .size    y, 4
y:
     .long    456
     .text
.globl func
     .type    func, @function
func:On 07/07/2011 07:40 AM, Oleksandr Gavenko wrote:
> On 07.07.2011 17:25, Andreas Schwab wrote:
>> Oleksandr Gavenko<gavenko@bifit.com.ua>  writes:
>>
>>> But how declare it local?
>>
>> Don't declare it global.
>>
> OK, but how?
>
> If I write:
>
>    .global @feat.00
>     @feat.00=1
>
> I get:
>
>   $ nm test.obj | grep feat
> 00000001 A @feat.00
>
> If I write:
>
>    /* .global @feat.00 */
>     @feat.00=1
>
> I get:
>
>   $ nm test.obj | grep feat
> <empty>
>
> So I expect existence of some directive to get wanted.
One suggestion is to write what you want in C, then use gcc's -S option 
to produce the assembly language, and look to see how gcc does it. For 
example,
int y = 456;

int func() {
     static int x = 123;
     x = x + 1;
     y = y + 1;
     return x + y;
}

gives

     .file    "static.c"
.globl y
     .data
     .align 4
     .type    y, @object
     .size    y, 4
y:
     .long    456
     .text
.globl func
     .type    func, @function
func:
.LFB0:
     .cfi_startproc
     pushq    %rbp
     .cfi_def_cfa_offset 16
     movq    %rsp, %rbp
     .cfi_offset 6, -16On 07/07/2011 07:40 AM, Oleksandr Gavenko wrote:
> On 07.07.2011 17:25, Andreas Schwab wrote:
>> Oleksandr Gavenko<gavenko@bifit.com.ua>  writes:
>>
>>> But how declare it local?
>>
>> Don't declare it global.
>>
> OK, but how?
>
> If I write:
>
>    .global @feat.00
>     @feat.00=1
>
> I get:
>
>   $ nm test.obj | grep feat
> 00000001 A @feat.00
>
> If I write:
>
>    /* .global @feat.00 */
>     @feat.00=1
>
> I get:
>
>   $ nm test.obj | grep feat
> <empty>
>
> So I expect existence of some directive to get wanted.
One suggestion is to write what you want in C, then use gcc's -S option 
to produce the assembly language, and look to see how gcc does it. For 
example,
int y = 456;

int func() {
     static int x = 123;
     x = x + 1;
     y = y + 1;
     return x + y;
}

gives

     .file    "static.c"
.globl y
     .data
     .align 4
     .type    y, @object
     .size    y, 4
y:
     .long    456
     .text
.globl func
     .type    func, @function
func:
.LFB0:
     .cfi_startproc
     pushq    %rbp
     .cfi_def_cfa_offset 16
     movq    %rsp, %rbp
     .cfi_offset 6, -16
     .cfi_def_cfa_register 6
     movl    x.1616(%rip), %eax
     addl    $1, %eax
     movl    %eax, x.1616(%rip)
     movl    y(%rip), %eax
     addl    $1, %eax
     movl    %eax, y(%rip)
     movl    x.1616(%rip), %edx
     movl    y(%rip), %eax
     leal    (%rdx,%rax), %eax
     leave
     .cfi_def_cfa 7, 8
     ret
     .cfi_endproc
.LFE0:
     .size    func, .-func
     .data
     .align 4
     .type    x.1616, @object
     .size    x.1616, 4
x.1616:
     .long    123
     .ident    "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
     .section    .note.GNU-stack,"",@progbits
     .cfi_def_cfa_register 6
     movl    x.1616(%rip), %eax
     addl    $1, %eax
     movl    %eax, x.1616(%rip)
     movl    y(%rip), %eax
     addl    $1, %eax
     movl    %eax, y(%rip)
     movl    x.1616(%rip), %edx
     movl    y(%rip), %eax
     leal    (%rdx,%rax), %eax
     leave
     .cfi_def_cfa 7, 8
     ret
     .cfi_endproc
.LFE0:
     .size    func, .-func
     .data
     .align 4
     .type    x.1616, @object
     .size    x.1616, 4
x.1616:
     .long    123
     .ident    "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
     .section    .note.GNU-stack,"",@progbits
.LFB0:
     .cfi_startproc
     pushq    %rbp
     .cfi_def_cfa_offset 16
     movq    %rsp, %rbp
     .cfi_offset 6, -16
     .cfi_def_cfa_register 6
     movl    x.1616(%rip), %eax
     addl    $1, %eax
     movl    %eax, x.1616(%rip)
     movl    y(%rip), %eax
     addl    $1, %eax
     movl    %eax, y(%rip)
     movl    x.1616(%rip), %edx
     movl    y(%rip), %eax
     leal    (%rdx,%rax), %eax
     leave
     .cfi_def_cfa 7, 8
     ret
     .cfi_endproc
.LFE0:
     .size    func, .-func
     .data
     .align 4
     .type    x.1616, @object
     .size    x.1616, 4
x.1616:
     .long    123
     .ident    "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
     .section    .note.GNU-stack,"",@progbits

which causes me to believe that placing your variable in the .data 
segment without a .global directive would give what you want.

--Bob



More information about the Binutils mailing list