With binutils from the 2.24 branch or trunk, the behaviour of --as-needed did
change, and what worked with binutils 2.23, now fails with 2.24:

$ cat thread.cpp
#include <thread>

void factorial(int n, unsigned long long int *result) {
        if (n==1) {
                *result=1;
                return;
        }
        *result=1;
        for (; n!=0; n--) *result=*result*n;
}

int main() {
        unsigned long long int a;
        unsigned long long int *c=&a;
        std::thread t1(factorial,15,c);
        t1.join();
        return 0;
}
$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.23.2
$ g++ -Wl,--as-needed -pthread thread.cpp -std=c++11 -o thread && ./thread

$ ld --version
GNU ld (GNU Binutils for Debian) 2.23.52.20130828
$ g++ -Wl,--as-needed -pthread thread.cpp -std=c++11 -o thread && ./thread
terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted

So the test program doesn't have any direct references to symbols in libpthread,
and isn't linked, and fails to run.

According to the binutils maintainers, this behaviour is expected:

  https://sourceware.org/ml/binutils/2013-08/msg00286.html
  https://sourceware.org/ml/binutils/2013-09/msg00000.html

but it seems a bit odd that g++ -Wl,--as-needed -pthread isn't working anymore.

  Matthias

Reply via email to