我有兴趣使用Linux头文件提供的unistd.h构建一个没有(g)libc的静态ELF程序.
我已经阅读了这些文章/问题,这些文章/问题粗略地概括了我正在尝试做什么,但并不完全:http: //www.muppetlabs.com/~breadbox/software/tiny/teensy.html
https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free
我有基本代码,它只依赖于unistd.h,其中我的理解是每个函数都是由内核提供的,而且不需要libc.这是我采取的最有希望的道路:
$ gcc -I /usr/include/asm/ -nostdlib grabbytes.c -o grabbytesstatic
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400144
/tmp/ccn1mSkn.o: In function `main':
grabbytes.c:(.text+0x38): undefined reference to `open'
grabbytes.c:(.text+0x64): undefined reference to `lseek'
grabbytes.c:(.text+0x8f): undefined reference to `lseek'
grabbytes.c:(.text+0xaa): undefined reference to `read'
grabbytes.c:(.text+0xc5): undefined reference to `write'
grabbytes.c:(.text+0xe0): undefined reference to `read'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
在此之前,我必须根据内核头文件中的值手动定义SEEK_END和SEEK_SET.否则就会错误地说那些没有定义,这是有道理的.
我想我需要链接到未经剥离的vmlinux来提供符号来使用.然而,我读完了符号,虽然有很多llseeks,但他们并不是llseek逐字逐句.
所以我的问题可以在几个方面:
如何指定ELF文件以使用符号?而且我猜测是否/如何可能,符号将不匹配.如果这是正确的,是否有一个现有的头文件将重新定义llseek和default_llseek或内核中的任何内容?
有没有更好的方法在没有libc的情况下在C语言中编写Posix代码?
我的目标是使用(可能只是)unistd.h编写或移植相当标准的C代码,并在没有libc的情况下调用它.我可能没有一些unistd函数,并且不确定哪些"纯粹"存在于内核调用或不存在.我喜欢集会,但这不是我的目标.希望保持尽可能严格的C(如果必须的话,我可以使用一些外部汇编文件),以便在某些时候允许无libc的静态系统.
谢谢你的阅读!
根据isascii()手册页:
http://linux.die.net/man/3/isascii
POSIX.1-2008将isascii()标记为已过时,并指出它无法在本地化应用程序中进行移植.
我不确定我看到可移植性问题在哪里.这个函数的一个非常简单的实现是:
int isascii(int ch) { return ch >= 0 && ch < 128; }
Run Code Online (Sandbox Code Playgroud)
在哪种情况下上述实现不充分或不可移植?
谢谢
我想提供共享库以及我的程序,而不是由于版本差异而使用目标系统.
ldd 说我的程序使用这些共享库:
linux-gate.so.1 => (0xf7ef0000)**(made by kernel)**
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)**
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)**
Run Code Online (Sandbox Code Playgroud)
我通过编译成功链接了ld-xxx.so:
gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c
Run Code Online (Sandbox Code Playgroud)
但我没有成功的链接libc-xxx.so.我怎样才能做到这一点 ?
我使用Mac Mini作为构建代理,我需要升级标准库.我在MacPorts上找不到libc或libstdc ++.
我正在写一个Android应用程序.我完全不知道它为什么经常发生.有人能告诉我可能导致它发生的原因是什么?谢谢!
09-29 13:58:00.540: INFO/DEBUG(4658): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
09-29 13:58:00.540: INFO/DEBUG(4658): Build fingerprint: 'MOTO/wifi_hubble/wifi_hubble:3.1/H.6.4-20/1310119769:user/ota-rel-keys,release-keys'
09-29 13:58:00.540: INFO/DEBUG(4658): pid: 23390, tid: 23390 >>> com.aaa.bbb <<<
09-29 13:58:00.540: INFO/DEBUG(4658): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
09-29 13:58:00.540: INFO/DEBUG(4658): r0 deadbaad r1 00000001 r2 a0000000 r3 00000000
09-29 13:58:00.540: INFO/DEBUG(4658): r4 00000000 r5 00000027 r6 00000028 r7 00000005
09-29 13:58:00.540: INFO/DEBUG(4658): r8 00000002 r9 001aa540 10 00000005 fp …Run Code Online (Sandbox Code Playgroud) 有没有一种可移植的方法来加载Python ctypes中的C标准库(libc.so,libc.dylib)?我应该只使用if/ elif声明platform.system()函数的结果吗?
$ printf 'int main(){}' | gcc -static -x c - -o hello
$ scp hello vi-server.org:./
hello 100% 565KB 565.2KB/s 00:00
$ ssh -t vi-server.org "./hello; uname -r"
FATAL: kernel too old
sh: line 1: 15378 Segmentation fault ./hello
2.6.18-274.... # can't easily upgrade the kernel
Connection to vi-server.org closed.
Run Code Online (Sandbox Code Playgroud)
如何构建可在旧系统上运行的静态二进制文件?我希望静态二进制文件在2.4上工作.
我正在尝试实现一个简单的第一个内存管理算法.所以我有一个自己的C文件
void* malloc(size_t)
Run Code Online (Sandbox Code Playgroud)
和
void free(void*)
Run Code Online (Sandbox Code Playgroud)
.out使用gcc 生成文件时,我期待链接错误,因为它会与现有的标准实现冲突.但我的文件链接很好.
请帮我理解.
我已经构建了一个像这样的简单程序:
g++ application.cpp -o application.exe
然后执行命令;
ldd application.exe
...
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
...
Run Code Online (Sandbox Code Playgroud)
我想列出libc库的所有符号:
nm /lib/x86_64-linux-gnu/libc.so.6
nm: /lib/x86_64-linux-gnu/libc.so.6: no symbols
nm --defined-only /lib/x86_64-linux-gnu/libc.so.6
nm: /lib/x86_64-linux-gnu/libc.so.6: no symbols
Run Code Online (Sandbox Code Playgroud)
为什么 nm 报告没有符号?如果 libc.so.6 不是库,而是某种指向实际库的链接,那么我如何才能找到实际库?
我很确定 glibc 是 gcc 的标准 C 库实现的名称。
但对于 LLVM/Clang,我不确定。我已经在谷歌上搜索过它是否带有整个标准 C 库的自己的实现,或者它们是否也使用 glibc。令人惊讶的是,我能找到的只是最近一篇讨论Google 正在考虑为 LLVM 编写新 libc 的文章。但不是那会取代什么。
即使在 LLVM/Clang 源代码库中,我也很有可能只是盲目或愚蠢,但我似乎找不到它。
明确地说,我只对 C 标准库感兴趣,而不是 C++ 标准库。我对研究它们printf对函数族的实现特别感兴趣。
有人可以告诉我在哪里可以找到 Clang 的 libc/标准 C 库实现或其源代码库吗?