http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56880
Bug #: 56880 Summary: R_X86_64_COPY bug Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: fredrickprasha...@gmail.com 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. We saw this bug also on ARM with R_ARM_COPY. test_misc.h: #ifndef __TEST_MISC_H__ #define __TEST_MISC_H__ struct test_array { int array_len; int array[]; }; void print_array(struct test_array *); #endif test_lib.c: #include "test_misc.h" #include <stdio.h> struct test_array test_dynamic = { 6, {1, 2, 3, 4, 5, 6}, }; void print_array(struct test_array *a) { int i; for (i = 0; i<a->array_len; i++) { printf("%d\n", a->array[i]); } } test_misc.c: #include "test_misc.h" extern struct test_array test_dynamic; int main() { print_array(&test_dynamic); return 0; } Makefile: all: test_misc.bin test_misc.bin: test_misc.o libtest.so cc test_misc.o libtest.so -o test_misc.bin libtest.so: test_lib.o cc -shared -Wl,-soname,libtest.so -o libtest.so test_lib.o test_lib.o: test_lib.c cc -fPIC -o test_lib.o -c test_lib.c .PHONY: clean clean: rm -rf test_misc.bin rm -rf libtest.so rm -rf *.o $ LD_LIBRARY_PATH=. ./test_misc.bin 0 0 0 0 0 0 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