Global variables and shared libraries

Stephan Bergmann sbergman@redhat.com
Wed Nov 28 14:17:00 GMT 2012


On 11/28/2012 03:09 PM, Bharath Ramesh wrote:
> On Wed, Nov 28, 2012 at 11:53:18AM +0530, Siddhesh Poyarekar wrote:
>> On 28 November 2012 11:11, Bharath Ramesh <bramesh@vt.edu> wrote:
>>> I want to export a global variable that has been defined in a
>>> shared library to the binary that links with it. The most common
>>> approach would be to declare the global variable as an extern
>>> variable in the application code. This approach would make the
>>> actual reference to the global variable be present in the data
>>> segment of the binary. My use case would require that the
>>
>> No it wouldn't, unless the binary is statically linked.  It comes up
>> as an undefined symbol in the binary and it is resolved at runtime by
>> the dynamic linker.  You can see this by doing an `objdump -x` on the
>> generated binary.  The global variable is defined in the data section
>> of the DSO binary.
>
> I am then definitely doing something wrong. I am attaching two
> simple test files and compile them as follows.
>
> libfoo:
> gcc -g -Wall -Wextra -O3 -fPIC -c foo.c
> gcc -g -Wall -Wextra -O3 -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o
>
> test:
> gcc -g -Wall -Wextra -O3 -o test test.c -Wl,-rpath . -L . -lfoo
>
> Now, if I run "nm" on test I get the following
>
> $ nm ./test | grep foo
> 0000000000601028 B foo
>
> Which indicates foo is in the data segment of the binary. The
> output of the test reflects the same.

Isn't that because the executable does not have relocations, so needs 
the address of a var it is referencing to be fixed at link time, and 
that the runtime loader does something special in that case?  I think 
"Linkers & Loaders" covers that general problem, but my understanding 
may well be rusty.

Stephan



More information about the Libc-help mailing list