I am trying to make our program runnable on some old Linux versions. One common import that prevents it is __longjmp_chk, added in glibc 2.11 but missing in older ones. One "solution" is to use -D_FORTIFY_SOURCE=0 but this turns off other fortify functions (__printf_chk etc) which are present in the target libc. Is there a way to make __longjmp_chk a "weak import" which would use the function from libc.so.6 if present, and fall back to local stub if not?
ELF weak import / fallback stubs for glibc functions
376 views Asked by Igor Skochinsky At
2
There are 2 answers
0
Armali
On
Is there a way to make
__longjmp_chka "weak import" which would use the function fromlibc.so.6if present, and fall back to local stub if not?
I'd say yes, using dlsym() to check for __longjmp_chk and acting accordingly:
/* cc -ldl */
#define _GNU_SOURCE
#include <setjmp.h>
#include <stdio.h>
#include <dlfcn.h>
void __longjmp_chk(sigjmp_buf env, int val)
{
void (*p)(sigjmp_buf, int) = dlsym(RTLD_NEXT, "__longjmp_chk");
if (p)
printf("use the function from libc\n"),
p(env, val);
else
{
printf("falling back to local stub\n");
/* local stub - whatever that may be */
}
}
main()
{ // try it
sigjmp_buf env;
while (!setjmp(env)) __longjmp_chk(env, 1);
return 0;
}
Related Questions in LINUX
- Is there some way to use printf to print a horizontal list of decrementing hex digits in NASM assembly on Linux
- Why does Hugo generate different taxonomy-related HTML on different OS's?
- Writes in io_uring do not advance the file offset
- Why `set -o pipefail` gives different output even though the pipe is not failing
- what really controls the permissions: UID or eUID?
- Compiling eBPF program in Docker fails due to missing '__u64' type
- Docker container unable to make HTTPS requests to external API
- Whow to use callback_query_handler in Python 3.10
- Create kea runtime directory at startup in Yocto image
- Problem on CPU scheduling algorithms in OS
- How to copy files into the singularity sandbox?
- Android kernel error: undefined reference to `get_hw_version_platform'
- Is there a need for BPF Linux namespace?
- Error when trying to execute a binary compiled in a Kali Linux machine on an Ubuntu system
- Issue with launching application after updating ElectronJs to version 28.0.0 on Windows and Linux
Related Questions in LINKER
- #include Header files in C with definition too
- Why veneer code generated by gcc for cortex-m0 seems 8-byte aligned?
- link.exe unresolved external symbol _mainCRTStartup
- C++. Ability to run executable file with external libraries on another pc
- LLD: How to Use –dll and –add-stdcall-alias Swiches
- Compiling C++ program with Opengl and Glut in windows
- Link shared library through makefile
- How to compile GLFW with GCC
- How do I link to GLFW using gcc on windows?
- Diff in `-Bsymbolic` behavior between gcc and clang?
- Trouble Including ImGui in C++ Project with CMake
- running the ld command through rust only works 50% of the time
- Visual Studio C++ (Express) 2022, LNK1105 and LNK1104
- How do I link files in an Xcode Build for C++
- "undefined reference to 'main'" : main.o created but main function not compiled
Related Questions in GLIBC
- Format String Exploitation - Unkown differences in leaked LIBC addresses
- How to use a newer linker and glibc in a Kotlin/Native project?
- C++ Boost program how to statically compiled with musl libc?
- Error "cannot find /usr/lib/libc_nonshared.a" when installing cmake
- Why is fork() accepted in strace if the actual syscall is clone()?
- How do I create an Android make file to merge a glibc based root filesystem into to the AOSP filesystem?
- Why VTune fails with error `[Instrumentation Engine]: __libc_thread_freeres()`?
- How to upgrade Glibc library in Ubuntu 22.04
- Linking to .so with newer symbol
- symbol lookup error: undefined symbol: __pow_finite
- Why can't I run my python executables in busybox?
- Where do man pages about libc come from if they do not come from glibc?
- Error: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found
- C++: performance, free(null)/delete null and `std::move`
- Error while executing make check on glibc build for LFS
Related Questions in ELF
- ELF binary has inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: Assertion `sym != NULL' failed
- Starting a firmware on imx7d m4 core with bootaux, on u-boot, fail when using TCM memory but not when using DDR memory
- Base virtual address for .text segment of PIE ELF executable on linux x86_64
- Adding entry to program header table
- Build/running a minimal Docker container Ubuntu:22.04 but recieving following invalid ELF header error
- Why in this case the offset relative to "pc" is 0x14, not 0x1C or 0x18?
- Getting the range of addresses where global variables are stored
- Linker error: error adding symbols: bad value with GNU ARM toolchain
- Managing Relocation Order Dependencies in ELF Shared Libraries
- bash: No such file or directory (for 32-bit binary on Ubuntu 20.04)
- Where is the order in which ELF relocations are applied specified?
- Loading two .elf files in Renode (bootloader and application)
- What are link maps in libdl and why they crash my app?
- Link symbols in an ELF executable
- Clang: Meaning of PLT32 in Godbolt
Related Questions in LIBC
- Get search paths for headers in the standard library in Clang?
- Can't upgrade to newest version of linux-image-6.5.0-26-generic
- yescrypt && memory usage
- Where do man pages about libc come from if they do not come from glibc?
- C: How is binary-mode versus text-mode implemented for `fopen`?
- __libc_init_array and global declared objects in cpp
- Compile clang into WASM using WASI-SDK
- GLIBC : How to tell the executable to link to specific version of GLIBC
- What are link maps in libdl and why they crash my app?
- API for getting list of nameservers used in system
- Why does not 'LANG=C' affect "Segmentation fault" message?
- How to disallow compilation against older shared libraries in cmake
- Linux userspace api: how to get size of address spaces of running executable linked as PIE without parsing /proc/self/maps?
- moved libc.so and libc.so.6 to my /home/ dir. Can I move them back to /lib/ using a live Ubuntu image?
- Unreal Engine 5 fails to start on Ubuntu 22.04
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
There are only a few ways to make this work, and most of them are enumerated here.
No.