force symbols for inline functions to be addressed at a particular library

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I have written a program and shared library, both of which use the
libc stat function. I want to build optimized and non-optimized
versions of each, and then run the optimized program against the
non-optimized library.

The stat function is inline, and thus the optimized version of my
shared library does not actually have the stat symbol.

My non-optimized program was compiled and linked against the
non-optimized library, and for some reason when g++ links my program
it thinks stat symbol should be found in my shared library. In fact it
should be found in libc.

At runtime, my non-optimized program looks for the stat symbol in my
(optimized) shared library, but because the shared library has had the
(inline) stat symbol optimized out I get a runtime error:
undefined symbol: stat

If anyone can give me some direction on how to get g++ to use the libc
stat symbol instead of my shared library's stat symbol I'd greatly
appreciate it.

Thanks,
-Peter

PS - Below is the code/script I'm using to show this undesired behaviour.
################# t.sh (compile/run) ######################
#! /bin/bash -v
# build non-O libfoo
g++ -O0 -c -o foo.o foo.cpp
g++ -O0 -shared -o libfoo_no.so foo.o

# build O libfoo
g++ -O -c -o foo.o foo.cpp
g++ -O -shared -o libfoo_o.so foo.o

# build t against no
rm -f libfoo.so
ln -s libfoo_no.so libfoo.so
gcc -O0 -c -o t.o t.c

# G++
g++ -O0 -o t_no -L. t.o -lfoo

echo
# run t_no with o
rm -f libfoo.so
ln -s libfoo_o.so libfoo.so
./t_no

############## foo.cpp ##################
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include "foo.h"

int thefile(const char *path) {
    struct stat statbuf;
    int rc = 0;
    printf("in thefile1: %s\n", path);
    rc = stat(path, &statbuf);
    printf("in thefile2: %s\n", path);
    return rc;
}

############# foo.h ############
int thefile(const char *path);

############# t.c #############
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include "foo.h"

############### int main(int argc, char *argv) ##############
{
    struct stat attr;
    printf("in main\n");
    stat("/tmp/aoeu", &attr);
    printf("in main2\n");

    return 0;
}

############ Output from compile/run ##################
./t.sh
#! /bin/bash -v
# build non-O libfoo
g++ -O0 -c -o foo.o foo.cpp
g++ -O0 -shared -o libfoo_no.so foo.o

# build O libfoo
g++ -O -c -o foo.o foo.cpp
g++ -O -shared -o libfoo_o.so foo.o

# build t against no
rm -f libfoo.so
ln -s libfoo_no.so libfoo.so
gcc -O0 -c -o t.o t.c

# G++
g++ -O0 -o t_no -L. t.o -lfoo

echo

# run t_no with o
rm -f libfoo.so
ln -s libfoo_o.so libfoo.so
./t_no
in main
./t_no: symbol lookup error: ./t_no: undefined symbol: stat

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux