Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix crash when linking with libdl on arm with NEON
With -mfpu=neon, libdl got a badly aligned .init_array section which
caused the dynamic linker to segfault when initializing any program that
links to libdl.

Added eglibc-2.15-fix-neon-libdl.patch to fix it.

Signed-off-by: Richard Braakman <richard.braakman@jollamobile.com>
  • Loading branch information
amtep committed Jun 26, 2013
1 parent 9a5f0ec commit cc59442
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
39 changes: 39 additions & 0 deletions eglibc-2.15-fix-neon-libdl.patch
@@ -0,0 +1,39 @@
When compiled for arm with -mfpu=neon, the .init_array section declared
here becomes 64-bit aligned. Since the dynamic linker expects an array of
32-bit function pointers with no gaps, this causes an immediate SIGSEGV
for any application linked with libdl.

I suspect the default array alignment becomes 64 bits because the neon
has 64-bit registers, but I'm not sure. The explicit aligned attribute
does not help because it can only increase the alignment.

Fortunately, the whole declaration can be replaced with a constructor
attribute on the init function, which also adds it to the init_array
table and does the right thing with alignment.

(Why wasn't it this way already? I don't know, but maybe the constructor
attribute wasn't available yet when this code was written.)

Richard Braakman
richard.braakman@jollamobile.com

--- eglibc-2.15/dlfcn/dlfcn.c 2006-08-17 04:18:26.000000000 +0300
+++ glibc-fixed/dlfcn/dlfcn.c 2013-06-10 13:20:34.846885906 +0300
@@ -24,16 +24,9 @@
char **__dlfcn_argv attribute_hidden;


-static void
+static void __attribute ((constructor))
init (int argc, char *argv[])
{
__dlfcn_argc = argc;
__dlfcn_argv = argv;
}
-
-static void (*const init_array []) (int argc, char *argv[])
- __attribute__ ((section (".init_array"), aligned (sizeof (void *))))
- __attribute_used__ =
-{
- init
-};
4 changes: 4 additions & 0 deletions glibc.changes
@@ -1,3 +1,7 @@
* Wed Jun 26 2013 Richard Braakman <richard.braakman@jollamobile.com> - 2.15
- Fix crash when linking with libdl on arm with NEON
eglibc-2.15-fix-neon-libdl.patch

* Wed Apr 24 2013 David Greaves <david@dgreaves.com> - 2.15
- ld.so.conf must use absolute paths when being called using -r
This happens when using scratchbox2 with x86 targets.
Expand Down
8 changes: 5 additions & 3 deletions glibc.spec
Expand Up @@ -36,6 +36,7 @@ Patch10: eglibc-2.15-mips-no-n32-n64.patch
Patch11: glibc-2.14-locarchive-fedora.patch
Patch12: eglibc-2.15-disable-multilib.patch
Patch13: eglibc-2.15-use-usrbin-localedef.patch
Patch14: eglibc-2.15-neon-fix.patch

Provides: ldconfig
# The dynamic linker supports DT_GNU_HASH
Expand Down Expand Up @@ -198,6 +199,7 @@ If unsure if you need this, don't install this package.
%patch12 -p1
%if 0%{?qemu_user_space_build}
%patch13 -p1
%patch14 -p1
%endif

# Not well formatted locales --cvm
Expand Down Expand Up @@ -242,10 +244,10 @@ AddOns=`echo */configure | sed -e 's!/configure!!g;s!\(linuxthreads\|nptl\|rtkai
AddOns=,ports$AddOns
%endif

%ifarch armv7tnhl
#%ifarch armv7tnhl
# workaround for a potential compiler bug using -mfpu=neon (gcc 4.6 2013.01)
BuildFlags="$BuildFlags -mfpu=vfpv3-d16"
%endif
#BuildFlags="$BuildFlags -mfpu=vfpv3-d16"
#%endif

build_nptl()
{
Expand Down

0 comments on commit cc59442

Please sign in to comment.