Re: Initialized variables in .bss

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 24/11/15 21:39, Florian Weimer wrote:
> On 11/24/2015 10:14 PM, Segher Boessenkool wrote:
> 
>>> However, there is still a subtle difference for non-static objects.
>>> Adding the initializer turns a tentative definition into a definite one,
>>> and it seems that this can't go into .bss.
>>
>> extern int a;
>> int a = 0;
>>
>> and
>>
>> int b;
>> int b = 0;
>>
>> go to .bss just fine.  Did you mean something different?
> 
> This is what I meant.  I still see a subtle difference in the generated
> executable, but it is not what I thought.  One should be using proper
> tools.  This is the diff after adding a couple of zero initializers:
> 
> @@ -810,7 +810,7 @@
>  00000000003958f8 d
> __elf_set___libc_thread_subfreeres_element___rpc_thread_destroy__
>  00000000003958e8 d
> __elf_set___libc_thread_subfreeres_element_strerror_thread_freeres__
>  00000000001699a0 r empty_path_elem
> -000000000039ea00 b _end
> +000000000039e9f8 b _end
>  00000000000fd6a0 T endaliasent
>  00000000000dfaa0 T endfsent
>  00000000000b3690 T endgrent
> @@ -1287,14 +1287,14 @@
>  00000000000216c0 T __gconv_get_modules_db
>  0000000000022d10 t __gconv_get_path
>  0000000000028c00 t __gconv_load_cache
> -000000000039e378 b __gconv_lock
> +000000000039a8e8 b __gconv_lock
>  0000000000028eb0 t __gconv_lookup_cache
> -000000000039e388 b __gconv_max_path_elem_len
> +000000000039e380 b __gconv_max_path_elem_len
>  00000000001620a9 r gconv_module_ext
> -000000000039e380 b __gconv_modules_db
> +000000000039e378 b __gconv_modules_db
>  0000000000020f20 t __gconv_open
> -000000000039e398 b __gconv_path_elem
> -000000000039e390 b __gconv_path_envvar
> +000000000039e390 b __gconv_path_elem
> +000000000039e388 b __gconv_path_envvar
>  00000000000230f0 t __gconv_read_conf
>  0000000000029310 t __gconv_release_cache
>  00000000000293c0 t __gconv_release_shlib
> @@ -3412,7 +3412,7 @@
>  0000000000397920 d __libc_utmp_file_functions
>  000000000039a438 d __libc_utmp_file_name
>  000000000039a430 d __libc_utmp_jump_table
> -000000000039e9f8 b __libc_utmp_lock
> +000000000039e164 b __libc_utmp_lock
>  00000000003978e0 d __libc_utmp_unknown_functions
>  000000000007a350 T __libc_valloc
>  00000000001656d0 r __libc_version
> @@ -4155,7 +4155,7 @@
>  000000000039b880 b old_realloc_hook
>  000000000011b980 t __old_realpath
>  000000000039bad0 b old_tz
> -000000000039a8e8 b once
> +000000000039a8ec b once
>  000000000039d77c b once.11214
>  000000000039dae4 b once.13803
>  000000000039bf64 b once.14680
> 
> So __gconv_lock moves towards the end, somehow improving the overall
> shared object size:
> 
> 1659534   20312   17192 1697038  19e50e build-pristine/libc.so.6
> 1659534   20312   17184 1697030  19e506 build/libc.so.6
> 
> (In the diff above, - is the pristine variant (without initializer) and
> + has the initializer.)
> 
> Anyway, it means I can submit my patch because the GCC optimization does
> what we need.
> 
> Thanks,
> Florian
> 

Don't forget that by default GCC uses the common model for C, meaning
that 'int x' is treated as a tentative definition.  If you want the
compiler to behave more like C++ in this regard, use -fno-common; but
that might break some legacy programs.

R.



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux