这个选项对ld意味着什么?
-lrt
我知道在某种程度上它意味着ld正在寻找具有实时扩展的库,但是在广泛搜索之后,我找不到这是指的确切定义(或哪个库).
使用Bionic(android)libc,android NDK文档详细说明了这个(以及pthreads)已经集成.
我问,因为它似乎是隐式的(即当我调用编译器时,直接调用自定义编译的gdc,我得到一条消息说ld找不到-lrt)
编辑
来自仿生概述
Bionic的C库附带了自己的pthread实现.这与其他历史C库不同:
Run Code Online (Sandbox Code Playgroud)- place it in an external library (-lpthread) - play linker tricks with weak symbols at dynamic link time
对实时功能(aka -lrt)的支持也捆绑在C库中.
问题是collect2将选项-lrt(以及-lpthreads)传递给ld.
dan@devbox:~/projects/gdc_test/jni/src$ $DC gdc_test.d -v -mthumb
Using built-in specs.
Target: arm-linux-androideabi
Configured with: /arm/ndk-git/src/build/../gcc/gcc-4.4.3/configure --prefix=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 --target=arm-linux-androideabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/arm/ndk-git/build_run/temp-install --with-mpfr=/arm/ndk-git/build_run/temp-install --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --enable-languages=c,d,c++ --enable-lto --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-shared--prefix=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 --enable-initfini-array --disable-nls --prefix=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 --with-sysroot=/arm/ndk-git/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/sysroot --with-binutils-version=2.19 --with-mpfr-version=2.4.1 --with-gmp-version=4.2.4 --with-gcc-version=4.4.3 --with-gdb-version=6.6 --with-arch=armv5te --enable-libstdc__-v3 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为Android系统实现本机共享库(.so).当然,有些代码块需要是线程安全的.
我在这里发现不支持pthreads锁,互斥锁或条件变量.
我想知道图书馆级别通常使用什么来实现线程安全?
android shared-libraries thread-safety bionic android-library
例如android正在使用仿生而不是glibc,但如何弄清楚它真的是使用仿生http://en.wikipedia.org/wiki/Bionic_(software),而不是glibc?
我可以在/ proc文件系统中找到这些信息,或者是否有任何命令可以告诉bionic在当前系统中使用?
顺便说一句,嵌入式系统可能有多个c lib吗?
您可能知道,Bionic是Google用来运行Android应用程序的C库.有人在Linux机器上进行编译,因此可以在Android之外轻松使用.这是最近一次努力的代码,最初称为Gentoo-bionic.原始项目是基于Gentoo的,但目前的来源不是Gentoo特有的.我正在使用Ubuntu.这是代码:
https://github.com/gentoobionic/bionic
这是关于ELC2013的介绍:
我试图在X86_64 Ubuntu上编译它,但失败了.我试过了:
./autogen.sh
./configure
Run Code Online (Sandbox Code Playgroud)
我有:
configure: error: unsupported host cpu x86_64
Run Code Online (Sandbox Code Playgroud)
所以我尝试过:
./configure --build=arm-linux --target=arm-linux --host=arm-linux
Run Code Online (Sandbox Code Playgroud)
配置很好,但我得到:
$ make
make: *** No rule to make target `libc/arch-x86/include/machine/cpu-features.h',
needed by `all-am'. Stop.
Run Code Online (Sandbox Code Playgroud)
是否有人可以建议解决方法?
对于 glibc,您可以在此处找到在线文档。
我正在寻找 Android 的 libc 实现的等效文档(标头位于 sysroot/usr/include 下)。
有这些的文档吗?
(例如 sysroot/usr/include/sys/vfs.h 下的调用 statfs())。
注意:符号显示在我们的 c++ 库的 crashlytics 中,问题是它们没有显示在
libc
、libart
、libbase
和 等系统库中libandroid_runtime
。
我们有一些完全发生在 Android 运行时中的棘手崩溃,如果没有符号,这些崩溃很难调试。在 firebase crashlytics 中,我们看到以下堆栈跟踪:
Crashed: Thread : SIGABRT 0x0000000000000000
#00 pc 0x4e574 libc.so
#01 pc 0x4e540 libc.so
#02 pc 0x5677d8 libart.so
#03 pc 0x13ab0 libbase.so
#04 pc 0x13090 libbase.so
#05 pc 0x38cb6c libart.so
#06 pc 0x39f7d8 libart.so
#07 pc 0x1260e0 libandroid_runtime.so
#08 pc 0x124ef4 libandroid_runtime.so
#09 pc 0x124dc4 libandroid_runtime.so
#10 pc 0x115468 libandroid_runtime.so
Run Code Online (Sandbox Code Playgroud)
当我通过取消引用空指针来强制 C++ 库中的测试崩溃时,我在本地 Android Studio 控制台中看到以下回溯:
...snip...
#06 pc …
Run Code Online (Sandbox Code Playgroud) 我越来越
E: The repository 'https://apt.postgresql.org/pub/repos/apt bionic-pgdg Release' no longer has a Release file.
Run Code Online (Sandbox Code Playgroud)
在 sudo apt update 上。这意味着仿生的存储库无法访问。
就我而言,这次我无法将 Ubuntu 版本升级到较新的版本,并且需要以某种方式进行管理。在这种情况下,我想我需要从 /etc/apt/sources.list.d 中删除文件,其中包含:
deb https://apt.postgresql.org/pub/repos/apt bionic-pgdg main
Run Code Online (Sandbox Code Playgroud)
那么我怎样才能在 Bionic 上安装 Postgresql呢?有什么方法可以从源代码下载并安装吗?
Android平台使用什么libc实现?使用哪种malloc实现(ptmalloc或tcmalloc或其他任何东西)?
我在http://androidxref.com/4.0.4/xref/bionic/libc/string/bcopy.c中阅读了memcpy实现, 发现以下代码很难理解,有人可以解释一下吗?
36 /*
37 * sizeof(word) MUST BE A POWER OF TWO
38 * SO THAT wmask BELOW IS ALL ONES
39 */
40 typedef long word; /* "word" used for optimal copy speed */
41
42 #define wsize sizeof(word)
43 #define wmask (wsize - 1)
44
Run Code Online (Sandbox Code Playgroud)
...
/*
78 * Copy forward.
79 */
80 t = (long)src; /* only need low bits */
81 if ((t | (long)dst) & wmask) {
82 /*
83 * …
Run Code Online (Sandbox Code Playgroud) 我有需要futimes
或futimens
功能的大型项目.不幸的是,android ndk include文件夹中的头文件中没有这样的函数.是否有解决方法(使用现有函数的存根或简单代码片段)?
futimes
可以在此处找到该功能的文档.
bionic ×10
android ×8
android-ndk ×3
c ×3
c++ ×2
libc ×2
automake ×1
compilation ×1
crashlytics ×1
gdc ×1
glibc ×1
malloc ×1
postgresql ×1
ubuntu ×1
ubuntu-18.04 ×1