On 04/07/2013 03:48 AM, Fredrick Prashanth John Berchmans wrote:
A struct with zero length array is defined in a shared library as a global data.
A binary links with this shared library and accesses the struct.
Because of copy relocation semantics, the binary linking with that
library sees(correctly) only the portion of the struct without the
zero length array.
We understand that it is due to the wrong or apparent size calculation
of the struct by GCC and using copy relocation semantics to resolve this
shared symbol is causing this problem.
This seems to be a bug in GCC:
.globl test_dynamic
.data
.align 4
.type test_dynamic, @object
.size test_dynamic, 4
test_dynamic:
.long 6
.long 1
.long 2
.long 3
.long 4
.long 5
.long 6
The .size directive is wrong. I couldn't find anything matching in
Bugzilla, so you probably should file a new bug.
As a workaround, you could declare the struct object in question as
static. This should disable copy relocation.
--
Florian Weimer / Red Hat Product Security Team