touch-packages team mailing list archive
-
touch-packages team
-
Mailing list archive
-
Message #101519
[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