← Back to team overview

touch-packages team mailing list archive

[Bug 1490352] Re: please backport aarch64 -Bsymbolic-functions fix to trusty

 

** Description changed:

- Go shared libraries depend on -Bsymbolic-functions working, which
- unfortunately doesn't in the version of binutils on trusty. The fix is
- in binutils-2_24-branch: https://sourceware.org/git/?p=binutils-
- gdb.git;a=commit;h=cd3813a8c9e59ccba0c42f5e3664465428e0e89c so could
- this be uploaded to trusty please? (I guess I should make this into a
- formal SRU request...)
+ There is a bug in the version ld.bfd in trusty on arm64, where even if
+ you pass -Bsymbolic-functions to ld, function pointer values are still
+ subject to interposition by other shared objects. This was fixed and
+ backported to the binutils-2_24 branch in January 2015.
+ 
+ [Impact]
+ Shared libraries for Go depend on -Bsymbolic-functions working
+ properly and while it's unlikely that we'll ever support a version of
+ Go on trusty that supports shared libraries, the arm64 builders for
+ Go's build dashboard are trusty machines and so I can't run the shared
+ library tests by default until this is fixed in trusty.
+ 
+ It's also extremely confusing to debug the problems this causes.
+ 
+ The bug existed on 32-bit ARM too, but there is a workaround: use gold
+ instead (which does not have this bug). That doesn't apply to arm64 as
+ there is no arm64 gold in trusty.
+ 
+ [Test Case]
+ 
+ $ cat shared.h
+ typedef int (*intfunc)(void);
+ int interpos(void);
+ intfunc getintfunc(void);
+ $ cat shared.c
+ #include <stdio.h>
+ #include "shared.h"
+ 
+ int interpos(void) {
+         return 0;
+ }
+ 
+ intfunc intfuncs[] = { interpos };
+ 
+ intfunc
+ getintfunc(void) {
+         return intfuncs[0];
+ }
+ 
+ void
+ callinterpos(void) {
+         printf("calling interpos directly says %d\n", interpos());
+ }
+ $ cat main.c
+ #include <stdio.h>
+ #include "shared.h"
+ 
+ int interpos(void) {
+         return 1;
+ }
+ 
+ int main(int argc, char** argv) {
+         callinterpos();
+         printf("calling interpos via pointer says %d\n", getintfunc()());
+ }
+ 
+ $ gcc -shared -Wl,-Bsymbolic-functions -o libshared.so shared.c
+ $ gcc -o main main.c ./libshared.so
+ $ ./main
+ calling interpos directly says 0
+ calling interpos via pointer says 1
+ 
+ The two values printed should be the same.
+ 
+ [Regression Potential]
+ It is ever so slightly possible that some package depends on the
+ broken behaviour, but that seems pretty unlikely given that this
+ behaviour does not occur on intel platforms.

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to binutils in Ubuntu.
https://bugs.launchpad.net/bugs/1490352

Title:
  please backport aarch64 -Bsymbolic-functions fix to trusty

Status in binutils package in Ubuntu:
  New

Bug description:
  There is a bug in the version ld.bfd in trusty on arm64, where even if
  you pass -Bsymbolic-functions to ld, function pointer values are still
  subject to interposition by other shared objects. This was fixed and
  backported to the binutils-2_24 branch in January 2015.

  [Impact]
  Shared libraries for Go depend on -Bsymbolic-functions working
  properly and while it's unlikely that we'll ever support a version of
  Go on trusty that supports shared libraries, the arm64 builders for
  Go's build dashboard are trusty machines and so I can't run the shared
  library tests by default until this is fixed in trusty.

  It's also extremely confusing to debug the problems this causes.

  The bug existed on 32-bit ARM too, but there is a workaround: use gold
  instead (which does not have this bug). That doesn't apply to arm64 as
  there is no arm64 gold in trusty.

  [Test Case]

  $ cat shared.h
  typedef int (*intfunc)(void);
  int interpos(void);
  intfunc getintfunc(void);
  $ cat shared.c
  #include <stdio.h>
  #include "shared.h"

  int interpos(void) {
          return 0;
  }

  intfunc intfuncs[] = { interpos };

  intfunc
  getintfunc(void) {
          return intfuncs[0];
  }

  void
  callinterpos(void) {
          printf("calling interpos directly says %d\n", interpos());
  }
  $ cat main.c
  #include <stdio.h>
  #include "shared.h"

  int interpos(void) {
          return 1;
  }

  int main(int argc, char** argv) {
          callinterpos();
          printf("calling interpos via pointer says %d\n", getintfunc()());
  }

  $ gcc -shared -Wl,-Bsymbolic-functions -o libshared.so shared.c
  $ gcc -o main main.c ./libshared.so
  $ ./main
  calling interpos directly says 0
  calling interpos via pointer says 1

  The two values printed should be the same.

  [Regression Potential]
  It is ever so slightly possible that some package depends on the
  broken behaviour, but that seems pretty unlikely given that this
  behaviour does not occur on intel platforms.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/binutils/+bug/1490352/+subscriptions


References