Articles of glibc

C程序使用glibc编译而不是默认库:执行权限被拒绝

这是我在stackoverflow的第一个问题,所以我会尽力做好。 语境: 我想提供一个可以在每个Linux发行版上运行的程序(例如,将使用C ++ 11的程序,在没有C ++ 11程序库的系统上运行)。 为此,我想复制我的程序使用的所有库,并将它们放在一个带有可执行文件的文件夹中,以便它可以使用这些库而不是系统的库。 我有两个环境来testing: – Opensuse,(GNU libc)2.19 – Ubuntu,(Ubuntu EGLIBC 2.17-Oubuntu5.1)2.17 我在Opensuse下编译我的程序,并在Ubuntu下运行它。 该程序使用默认库时效果很好。 项目: 这里是main.c : int main(int ac, char **av) { printf("Hello World !\n"); } 这里是Opensuse下的文件夹树(在没有main.c和exec.sh的Ubuntu下也一样): + project | +— main.c +— a.out +— exec.sh +—+ lib | +— libc.so.6 +— ld-linux-x86-64.so.2 最后,当我用一个简单的编译启动程序时,这里是ldd和readelf: > gcc main.c -o a.out > […]

用UCLIBC交叉编译PHP

这是一个REPOST,以前的岗位GOTclosures,搬到SERVERFAULT和再次closures。 我认为这个post是一个有效的stackoverflow问题,因为我认为它是由一些automake /编译/链接错误引起的。 这是一个编程问题,而不是服务器pipe理员问题。 交叉编译PHP https://serverfault.com/questions/418521/cross-compile-php 开始发布 我已经下载了PHP 5.4.0源代码,将其解压缩并移入源文件夹。 我做了一个configuration: ./configure –build=x86_64-unknown-linux-gnu –host=arm-linux-uclibcgnueabi –prefix=/usr/arm/www CC="arm-linux-uclibcgnueabi-gcc –sysroot=/toolchains/gnu_cortex-a9_tools/" –disable-libxml –disable-dom –without-iconv –without-openssl –disable-simplexml –disable-xml –disable-xmlreader –disable-xmlwriter –without-pear –without-sqlite3 –disable-pdo –without-pdo-sqlite –disable-phar –with-config-file-path=/etc/ 其次是 make 没有错误,一切运行良好。 接下来我做一个make install。 make install 再次,一切运行良好。 我将它移动到目标平台并运行 /usr/arm/www/bin/php -v PHP 5.4.0 (cli) (built: Aug 15 2012 16:07:41) Copyright (c) 1997-2012 The PHP Group […]

如何使用settimeofday(2)?

我在这里做错了什么? 我期望settimeofday()来更改系统时间,而不是返回EINVAL 。 $ uname -a Linux io 4.3.5-300.fc23.x86_64 #1 SMP Mon Feb 1 03:18:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ cat settimeofday.c #include <sys/time.h> #include <stdio.h> int main() { struct timeval tv = {0, 0}; if (settimeofday(&tv, 0) == -1) perror("settimeofday"); } $ gcc settimeofday.c $ sudo ./a.out settimeofday: Invalid argument 错误来自运行Fedora 23的Thinkpad […]

交叉编译glibc为arm,得到了一些unwind函数的undefined引用

现在我需要为我们的armv7 soc平台构buildglic-2.15。 我按照以下步骤来构build它: 从http://ftp.gnu.org/gnu/libc/下载并解压glibc-2.15和glibc-ports mkdir build-glibc cd build-glibc echo "CFLAGS += -D__ARM_ARCH_7__ -D__LINUX_ARM_ARCH__=7 -march=armv7 -U_FORTIFY_SOURCE -fno-stack-protector" > configparms PATH={toolchain}/bin BUILD_CC={build}/bin/gcc CC={toolchain}/bin/arm-linux-gnueabihf-gcc AR={toolchain}/bin/arm-linux-gnueabihf-ar RANLIB={toolchain}/bin/arm-linux-gnueabihf-ranlib ../glibc-2.15/configure –prefix=/linaro-toolchain/ \ –exec-prefix=/linaro-toolchain/ \ –host=arm-linux-gnueabihf \ –build=i686-pc-linux-gnu \ –disable-profile –enable-add-ons=ports,nptl \ –enable-kernel=2.4.0 –with-tls –with-__thread \ –without-gd –without-cvs \ –with-headers=/linaro-toolchain/arm-linux-gnueabihf/libc/usr/include \ –disable-multilib –enable-shared \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes \ lic_cv_gnu89_inline=yes lic_cv_ssp=no \ libc_cv_ctors_header=yes […]

套接字事件如何传播/转换为epoll?

我很好奇epoll_wait()是如何收到一个注册套接字(带有epoll_ctl())准备好读/写的事件。 我相信glibc神奇地处理它。 那么,是否有一个文档描述了如何为套接字触发以下事件? EPOLLPRI EPOLLRDNORM EPOLLRDBAND EPOLLWRNORM EPOLLWRBAND EPOLLMSG EPOLLERR EPOLLHUP EPOLLRDHUP PS最初我试图将枚举EPOLL_EVENTS粘贴到我的盒子的sys / epoll.h中; stackoverflow认为,我不正确格式化代码块,虽然我用pre包装,然后代码标签,任何想法?

在汇编器中打印浮点数

我试图从调用printf函数的汇编程序打印浮点值。 它工作正常的string和整数值,但无法打印浮游物。 这是一个工作代码的例子: global main extern printf section .data message: db "String is: %d %x %s", 10, 0 end_message: db ".. end of string", 0 section .text main: mov eax, 0xff mov edi, message movsxd rsi, eax mov rdx, 0xff mov rcx, end_message xor rax, rax call printf ret string是:255 ff ..string的结尾 所以,参数是通过寄存器传递的: edi包含一个格式化string的地址, rsi和rdx包含相同的数字以十进制和hex格式打印, […]

mmap是一个内置函数吗?

我知道mmap是一个系统调用,但glibc中必须有一些包装器来执行系统调用。 然而当我尝试使用gdb来遍历我的程序中的mmap函数时, gdb忽略它,因为它找不到任何源文件(注意我从源代码编译自己的glibc)。 我可以通过其他glibc库函数,如printf和malloc而不是mmap 。 我也使用了flag -fno-builtin,以便gcc不使用内置函数。 任何帮助,将不胜感激。

了解C程序中的汇编语言_start标签

我写了一个简单的C程序,并试图使用GDB来debugging程序。 我明白在主要function中使用以下内容: 在进入 push %ebp mov %esp,%ebp 退出时 leave ret 然后我尝试gdb的_start,我得到了以下 xor %ebp,%ebp pop %esi mov %esp,%ecx and $0xfffffff0,%esp push %eax push %esp push %edx push $0x80484d0 push $0x8048470 push %ecx push %esi push $0x8048414 call 0x8048328 <__libc_start_main@plt> hlt nop nop nop nop 我无法理解这些线,以及这背后的逻辑。 有人可以提供任何指导,以帮助解释_start的代码?

移动到不同的Linux构build系统,出现错误:undefined symbol:stat

这可能只是我正在迁移到的构build系统的一个问题,但是我将在两个系统中包含差异以及我如何遇到问题。 我的旧版本系统是SLES 10机器。 gcc / cpp / g ++版本是4.1.0 我的新系统在SLES 11 SP4上,而gcc / cpp / g ++版本是4.3.4。 我正在build立一个共享库; 在新系统上build立和连接工作很好。 但是,在新系统加载时,我得到以下结果: error ./mysharedlib.so: undefined symbol: stat 由于status()函数包含在/usr/include/sys/stat.h中,所以我在两个系统上查看了glibc。 旧: # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.4-31.2 和新的: # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.11.3-17.95.2 我还查看了旧系统上与stat()相关的objdump输出: # objdump -T mysharedlib.so | grep stat 0000000000000000 D *UND* 0000000000000000 __xstat # objdump […]

不同的程序是从一个共同的堆还是从一个单独的堆中获取内存?

我有点困惑如何在Linux上glibc分配其内存的各种program.These是几个问题: 它是从一个共同的堆(即在Linux中的所有进程中是否有共同的堆)分配的,还是为系统中的每个进程分配一个堆? 还假设如果我正在编译一个静态库,它最终得到静态链接到主进程,它将如何得到它的内存? 它是否已经与其他堆相关联(如我们已经编译过的那样),还是会从主进程的堆中获取内存。