linux/gcc: ldd functionality from inside a C/C++ program
As per ld.so(8), setting the environment variable LD_TRACE_LOADED_OBJECTS
to a non-empty string will give ldd
-like results (instead of executing the binary or library normally).
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
How to build a C program using a custom version of glibc and static linking?
Following a couple of suggestions from the glibc help mailing list (libc-help@sourceware.org), I have a solution. It turns out that this task is a bit tricky because you have to tell the linker to omit everything it would normally include automatically (and silently), and then include back everything that it needs, including a bunch of start and end files. Some of the start and end files come from libc and some come from gcc, so the make rule is a bit complicated. Below is a general sample makefile to illustrate the approach. I will assume that you are building a program called prog from a source file called prog.c and that you have installed your custom glibc in directory /home/my_acct/glibc_install.
TARGET = prog
OBJ = $(TARGET).o
SRC = $(TARGET).c
CC = gcc
CFLAGS = -g
LDFLAGS = -nostdlib -nostartfiles -static
GLIBCDIR = /home/my_acct/glibc_install/lib
STARTFILES = $(GLIBCDIR)/crt1.o $(GLIBCDIR)/crti.o `gcc --print-file-name=crtbegin.o`
ENDFILES = `gcc --print-file-name=crtend.o` $(GLIBCDIR)/crtn.o
LIBGROUP = -Wl,--start-group $(GLIBCDIR)/libc.a -lgcc -lgcc_eh -Wl,--end-group
$(TARGET): $(OBJ)
$(CC) $(LDFLAGS) -o $@ $(STARTFILES) $^ $(LIBGROUP) $(ENDFILES)
$(OBJ): $(SRC)
$(CC) $(CFLAGS) -c $^
clean:
rm -f *.o *.~ $(TARGET)
Linking mosquitto library to hello.c program on Linux
/usr/bin/ld: cannot find -lmosquitto
The linker doesn't look for libmosquitto.so.1
-- it only looks for libmosquitto.a
or libmosquitto.so
.
Solution: ln -s libmosquitto.so.1 libmosquitto.so
./pub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
The problem here is that the runtime loader doesn't look in the current directory for libmosquitto.so.1
-- it only looks in system-configured directories.
You could fix this by adding export LD_LIBRARY_PATH=$HOME/mosquitto/lib
, but this is suboptimal -- your binary will work or not depending on the environment.
A better solution is to change your link command like so:
gcc -o hello hello.c -L. -lmosquitto -Wl,-rpath=$HOME/mosquitto/lib
Linking a C program directly with ld fails with undefined reference to `__libc_csu_fini`
I found another post which contained a clue: -dynamic-linker /lib/ld-linux.so.2
.
Try this:
$ gcc hello.c -S -masm=intel
$ as -o hello.o hello.s
$ ld -o hello -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o hello.o -lc /usr/lib/crtn.o
$ ./hello
hello, world
$
Linux C program: How to find the library to which a function belongs
At runtime, you can use gdb
for this:
(terminal 1)$ ./a
pid is 16614
address of printf is 0x400450
(terminal 2)$ gdb -p 16614
(...)
Attaching to process 16614
(...)
0x00000000004005a4 in main ()
(gdb)
(gdb) info sym printf
printf in section .text of /lib/x86_64-linux-gnu/libc.so.6
If you don't want to interrupt your program or are reluctant to use gdb
, you may also ask ld.so
to output some debugging info:
(terminal 1)$ LD_DEBUG=bindings LD_DEBUG_OUTPUT=syms ./a
pid is 17180
address of printf is 0x400450
(terminal 2)$ fgrep printf syms.17180
17180: binding file ./a [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `printf' [GLIBC_2.2.5]
Related Topics
Diolan Dln-2 Spi Controller on X86_64 Platform
Is There a Linux Command to Determine the Window Ids Associated with a Given Process Id
How to Remove All White Spaces from a Given Text File
Rsync How to Include Directories But Not Files
How to Set a Global Nofile Limit to Avoid "Many Open Files" Error
How to Capture Still Image from Webcam on Linux
Linux Kernel: What Process Does Schedule() Run In
In Linux Terminal, How to Delete All Files in a Directory Except One or Two
Conda.Exe: Error While Loading Shared Libraries: Libz.So.1
Can't Run Executable Linked with Libc
How to Export Symbol from Linux Kernel Module in This Case
How to Check If There Are Symbolic Links Pointing to a Directory
How to Post Raw Body Data with Curl
How to Capture the Output of a Top Command in a File in Linux
Gcc Compilation "Cannot Compute Suffix of Object Files: Cannot Compile"