Tag: libc

使用比libc更新的linux头文件构建

我想使用自Linux 3.14以来可用的新SCHED_DEADLINE调度策略编写程序。 我开始尝试使用sched_setattr函数的简单程序。 #include int main(void) { // struct sched_attr attr; // attr.size = sizeof(struct sched_attr); // attr.sched_policy = SCHED_DEADLINE; sched_setattr(0, (void*)0, 0); return 0; } 但是在编译时我收到以下错误: $gcc dead.c dead.c: In function ‘main’: dead.c:8:2: warning: implicit declaration of function ‘sched_setattr’ [-Wimplicit-function-declaration] sched_setattr(0, (void*)0, 0); ^~~~~~~~~~~~~ /tmp/ccGxWxZE.o: In function `main’: dead.c:(.text+0x19): undefined reference to `sched_setattr’ collect2: […]

memccpy返回的内存地址低于src起始地址

我有一个学校项目,我必须重新编码memccpy()函数。 我使用2个程序来检查我的代码是否正常工作。 第一个是只有一个主要的小程序。 第二个程序是由另一个学生开发的(如果你想看的话可以在这里找到) 使用我的程序,没有问题,我的memccpy和原始函数都从dest指针返回正确字符的右指针。 但是对于第二个程序,原始函数返回一个比指针开始地址更低的指针地址,例如: src值的起始地址: 0x7fff712edc40 Memccpy返回指针地址: 0x712edc44 我的memccpy函数返回指针: 0x7fff712edc44 因此,当有人在他的计算机上编译并且我的代码返回正确的地址时,它必须来自第二个程序。 有人知道是什么导致这种行为吗? 我试图在Google上搜索,但答案并不是很有帮助。 我多次读这个男人^^’(不是更有帮助)。 我读到memccpy在内存重叠时有一个未定义的行为,但它们不重叠。 这是我的ft_memccpy()函数: void *ft_memccpy(void *str_dest, const void *str_src, int c, size_t n) { unsigned int i; char *dest; char *src; char *ptr; dest = (char *)str_dest; src = (char *)str_src; i = 0; ptr = 0; while (i < […]

sigemptyset()NDK UnsatisfiedLinkError dlopen()

我的Android NDK应用程序中的某个C代码调用signal.h中定义的sigemptyset()函数。 我正在使用NDK-r9构建我的项目。 在编译c代码之后,我的库文件名为“libnative-service.so” 。 但是在运行应用程序时,我得到关于sigemptyset()的以下错误。 我错过了什么? 09-22 15:13:09.102: E/art(3718): dlopen(“/data/app-lib/com.project/libnative-service.so”, RTLD_LAZY) failed: dlopen failed: cannot locate symbol “sigemptyset” referenced by “libnative-service.so”… 09-22 15:13:09.103: D/AndroidRuntime(3718): Shutting down VM 09-22 15:13:09.106: E/AndroidRuntime(3718): FATAL EXCEPTION: main 09-22 15:13:09.106: E/AndroidRuntime(3718): Process: com.project, PID: 3718 09-22 15:13:09.106: E/AndroidRuntime(3718): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol “sigemptyset” referenced by “libnative-service.so”…

clock_gettime和CLOCK_MONOTONIC上的编译错误

我在程序中使用clock_gettime。 我试过包括但是没有效果。 我还为我的编译器参数添加了-lrt但仍然得到了相同的错误。 这是开启 CentOS Linux release 7.2.1511 (Core) gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4) GNU ld version 2.23.52.0.1-55.el7 20130226 ldd (GNU libc) 2.17 编译器输出: gcc -o main packet.c connect.c transport.c accept.c main.c close.c util.c receive.c send.c congestion.c -Wall -g -std=c99 -lrt util.c: In function ‘millis’: util.c:42:21: error: storage size of ‘t’ isn’t known […]

ftell(FILE * fd)和lseek(int fd,off_t offset,int whence)的结果之间的差异

考虑这个代码示例: #include #include #include int main() { //this file exists and contains data: “ABCDEFGHIJKLM” FILE* file = fopen(“file.txt”, “r”); char data[4]; long int pos = ftell(file); fseek(file, 0, SEEK_SET); fread(data, 4, 1, file); fseek(file, pos, SEEK_SET); printf(“ftell: %d\n”, ftell(file)); printf(“lseek: %d\n”, lseek(fileno(file), 0, SEEK_CUR)); fread(data, 1, 4, file); //this correctly prints A //but external function […]

程序如何inheritance环境变量?

当我使用标准C库中的函数getenv() ,我的程序从其父级inheritance环境变量。 例: $ export FOO=42 $ <<< 'int main() {printf("%s\n", getenv("FOO"));}' gcc -w -xc – && ./a.exe 42 在libc中, environ变量声明为environ.c 。 我期待它在执行时是空的,但我得到42 。 进一步getenv可以简化如下: char * getenv (const char *name) { size_t len = strlen (name); char **ep; uint16_t name_start; name_start = *(const uint16_t *) name; len -= 2; name += 2; for (ep […]

qsort和bsearch指针数组

我需要排序一个指向struc的指针数组。 实际上,我需要在地址中进行搜索,以查看数组中是否存在指向结构的指定指针。 不幸的是,我在这些结构中没有任何“可比性”的东西,所以我只想按地址排序。 我的代码是这样的: item* arr[SIZE]; //something is inserted qsort(arr, SIZE, sizeof(item*), (void*)compare_funct); //CUT bsearch(curr, arr, SIZE, sizeof(item*), (void*)compare_funct); 我尝试创建一个compare_funct,只是将指针转换为int并返回它们的差异,但它似乎不起作用。 特别是,当我进行bsearch时,即使我知道元素包含在数组中,我总是得到一个NULL作为返回值。

我使用tm / mktime是错误的,如果没有,是否有解决方法?

我认为以下程序应该从每年的第一天输出从1970年到1970年的秒数,然后是它编译的系统上的time_t的大小( CHAR_BIT是一个宏,所以我认为你不能只复制编译可执行文件并假设它是正确的虽然在实践中一切都使用8位char这些天)。 #include #include #include #include #include void do_time(int year) { time_t utc; struct tm tp; memset(&tp, 0, sizeof(tp)); tp.tm_sec = 0; tp.tm_min = 0; tp.tm_hour = 0; tp.tm_mday = 1; tp.tm_mon = 0; tp.tm_year = year – 1900; tp.tm_wday = 1; tp.tm_yday = 0; tp.tm_isdst = -1; printf(“%d %ld\n”,year, mktime(&tp)); } int main(){ printf(“time_t […]

有关libc指针加密的问题

glibc和eglibc有一个PTR_MANGLE ,它可以加密可写内存中的指针(更准确地说,’XOR’而不是’encrypt’)。 我没有太多关于这个function的阅读。 man -k PTR_MANGLE没有回复,谷歌正在回复一些肤浅的喋喋不休。 Drepper在Live Journal上的Pointer加密是为数不多的权威文章之一。 有没有深入的文件? 它可以扩展到用户空间进程,还是仅限于运行时库? 如果是,启用该function的编译器开关或选项是什么? 可以在运行时禁用该function吗?

在OSX 10.9.5上的libc中的wordexp是否已泄漏?

在OSX wordexp上的wordexp是否已知泄漏内存? 如果没有,我的代码有什么问题? 在我自己的运行OSX 10.10.5的本地机器上,我通过Valgrind运行我的代码并且没有丢失的字节 。 我的Ubuntu Linux机器上也没有泄漏 。 但是,当我在使用OSX 10.9.5的 travis-ci帐户上启用valgrind检查时,我突然从wordexp内部分配的内存中泄漏,即使我使用wordfree释放它,因为手册页描述: ==8968== LEAK SUMMARY: ==8968== definitely lost: 1,024 bytes in 1 blocks ==8968== indirectly lost: 0 bytes in 0 blocks ==8968== possibly lost: 0 bytes in 0 blocks OSX 10.9.5 uname输出: Darwin 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 […]