小编Emp*_*ian的帖子

在C/C++应用程序中分析过多代码大小的一些技术或工具是什么?

我有一个C++库,可以生成更大的代码,我真的期望它正在做什么.从不到50K的源代码行中,我获得了大约4 MB的共享对象和静态归档推送9.这是有问题的,因为库二进制文件非常大,更糟糕的是,甚至连接它的简单应用程序通常会获得500到1000 KB代码大小.使用像-Os这样的标志编译库有点帮助,但不是很多.

我还尝试了GCC的-frepo命令(尽管我见过的所有文档都表明Linux上的collect2将会合并重复的模板)和模板上的显式模板实例化似乎"可能"重复很多,但是没有两种情况都有实际效果.当然,我说"可能",因为,与任何类型的剖析一样,这样的盲目猜测几乎总是错误的.

是否有一些工具可以轻松地分析代码大小,或者其他一些方法我可以找出占用这么多空间的东西,或者更一般地说,我应该尝试的其他任何东西?在Linux下工作的东西是理想的,但我将采取我能得到的东西.

c++ linux gcc code-size

5
推荐指数
1
解决办法
1276
查看次数

如果使用valgrind启动,信号处理程序中的snprintf会创建分段错误

这个非常简单的c程序在使用valgrind运行时会给我一个分段错误.它开始正常时运行良好.将USR1信号发送到进程时会崩溃.

问题似乎是printf处理浮点值格式化的方式,因为如果使用字符串(%s)或int(%d)格式参数,它可以正常工作.

PS我知道你不应该在信号处理程序中调用任何printf系列函数,但仍然为什么它只与valgrind崩溃.

    #include <stdio.h>
    #include <signal.h>

    void sig_usr1(int sig) {
            char buf[128];
            snprintf(buf, sizeof(buf), "%f", 1.0);
    }

    int main(int argc, char **argv) {
            (void) signal(SIGUSR1, sig_usr1);
            while(1);
    }
Run Code Online (Sandbox Code Playgroud)

c printf valgrind segmentation-fault

5
推荐指数
1
解决办法
2135
查看次数

枚举当前已加载的所有共享库的所有ELF节

我正在寻找一种枚举所有ELF节及其当前二进制文件的地址以及当前进程可能已加载的所有共享对象的好方法。

我知道dl_iterate_phdr()的存在,这使我可以轻松使用ELF 列表,但是我正在寻找ELF ,所以这不是我的正确选择。

我不关心可移植性,只要它可在带有ELF的Linux上运行,我就很高兴!

任何提示表示赞赏!

c linux process elf dynamic-linking

5
推荐指数
1
解决办法
687
查看次数

同位素过滤器从另一页链接

我正在研究jquery同位素,过滤器在同一页面portfolio.html上使用下面给出的方法工作得很好:

<li class="current"><a href="#" data-filter="*">all</a></li>
<li><a href="#" data-filter=".design">design</a></li>
<li><a href="#" data-filter=".coding">coding</a></li>
<li><a href="#" data-filter=".logo">logo</a></li>
Run Code Online (Sandbox Code Playgroud)

我想要实现的是链接到特定类别,以便我的用户可以从其他页面进入过滤类别.

我尝试了以下链接方法,但它不起作用:

<a href="portfolio.html#filter=logo" data-filter=".logo">logo</a>
Run Code Online (Sandbox Code Playgroud)

谁能帮我吗?有没有任何方法来预过滤类别?

jquery filter jquery-isotope

5
推荐指数
1
解决办法
9465
查看次数

为什么 elf 文件中的段可以重叠

简单的C文件:

#include <stdio.h>
int main(){
    printf("Hello World");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译代码后,使用readelf -a a.out,精灵信息如下:

elf 程序头、段信息

问题:

  1. 几个部分出现在不同的段中,例如第二段和第三段中的 interp 部分。一个部分如何出现在多个部分中?
  2. 第二段的地址从 0x8048134 开始,但第三个 LOAD 段从 0x8048000 开始,0x004d0 memsize。那么这两段重叠?两个段如何在内存中重叠?
  3. 为什么程序头的偏移量和 viraddr 必须与页面大小模数一致?

assembly elf segment

5
推荐指数
2
解决办法
2844
查看次数

Linux:ntohl无法正常工作

我有一个需要在Windows,Linux和VxWorks上构建的项目.该项目建立在Linux和Windows上,但是为VxWorks交叉编译.要处理跨多个平台的字节序,它使用ntoh.h. Linux机器是小端,但是ntohl不会交换我的程序.

我写了一个直接包含in.h的测试程序.交换得恰到好处.我写了另一个包含ntoh.h的测试程序.交换得恰到好处.两个测试程序都链接到lib64/libc.so.6.

但是,当我编译我的项目时,ntohl不会交换.我无法使用gdb"break ntohl"命令打破ntohl.在构建时,我看到LITTLE ENDIAN警告(见下文)并且没有看到"SHOULDNT BE HERE"错误.

请帮忙.我不明白为什么会出现这个问题.

下面是ntoh.h:

#ifndef __ntoh__
#define __ntoh__

#include "basic_types.h"

#ifdef WIN32
    #include <winsock2.h>
#elif LINUX
    #include <netinet/in.h>

    //This is here to determine what __BYTE_ORDER is set to in netinet/in.h.
    // Not in original code 
    #if __BYTE_ORDER == __BIG_ENDIAN
    #warning BIG ENDIAN BYTE ORDER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    #endif 

    //This is here to determine what __BYTE_ORDER is set to in netinet/in.h. 
    // Not in original code
    #if __BYTE_ORDER == __LITTLE_ENDIAN
    #warning YAY LITTLE ENDIAN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! …
Run Code Online (Sandbox Code Playgroud)

c++ linux endianness

5
推荐指数
1
解决办法
3835
查看次数

在创建共享库时让ld忽略未定义的引用

我想获得gccld来自编译一堆对象文件放在一起时共享库忽略未解决的参考-fpic标志.

到目前为止,我尝试了很多选项(为了简洁起见,用一些小文件代替了许多目标文件的长文件名):

ld --allow-shlib-undefined --unresolved-symbols=ignore-all -shared 1.o 2.o -o lib0.so
ld -G 1.o 2.o -o lib0.so
Run Code Online (Sandbox Code Playgroud)

(我的某处是红色的,-G可以提供未解决的引用,但是没有运气.)

虽然gcc(带-Wl,--unresolved-symbols=ignore-all)运行它会导致更少的未解析引用,因为它默认链接

-lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt
Run Code Online (Sandbox Code Playgroud)

但它仍然抱怨没有-lopengl32-lgdi32.

编译lib没有-fpic,将所有目标文件存储在.awith ar和静态链接中,同时具有exe程序链接-lopengl32-lgdi32导致完全正常工作.

实际的错误消息(为简洁起见,替换了长文件和函数名称):

[file].o: In function `[function]': [file].cpp:19: undefined reference to `memcpy'
[file].o: In function …
Run Code Online (Sandbox Code Playgroud)

linker gcc mingw ld

5
推荐指数
1
解决办法
6812
查看次数

Vue.js 将文本中的主题标签替换为 &lt;router-link&gt;

我从服务器收到一些文本,其中可能包含一些主题标签,当显示此文本时,我想用链接转换这些标签。

示例文本为:“今天#天气非常好”

以下代码将字符串转换为

Today <router-link to="/tag/weather">#weather</router-link> is very nice
Run Code Online (Sandbox Code Playgroud)

但它不会再次呈现给<a>标签。

<template>
       <p v-html="content"/>
</template>

<script>
export default {
    methods: {
        convertHashTags: function(str) {
            return str.replace(/#([\w]+)/g,'<router-link to="/tag/$1">#$1</router-link>')
        }
    },
    data() {
        return{
             content: 'Today #weather is very nice'
        };
    }

</script>
Run Code Online (Sandbox Code Playgroud)

如何重新渲染内容?

我尝试了https://codepen.io/movii/pen/WORoyg 这种方法,但它期望整个字符串是一个链接,而不是一些文本和一些链接。

javascript vue-router vuejs2 routerlink

5
推荐指数
1
解决办法
3625
查看次数

GNU ld 的 --audit 标志有什么作用?

我有一个应用程序,我想使用rtld-auditLinux 提供的接口来挂钩共享库加载过程。如果我在运行程序时使用LD_AUDIT环境变量告诉动态链接器使用我的审计库audit.so,这将非常有效。

但是,我想让它更加自动化,不需要特殊的环境设置。GNUld提供了一个--audit标志,描述如下:

--audit AUDITLIB
Run Code Online (Sandbox Code Playgroud)

将 AUDITLIB 添加到动态部分的“DT_AUDIT”条目。不会检查 AUDITLIB 是否存在,也不会使用库中指定的 DT_SONAME。如果多次指定,“DT_AUDIT”将包含要使用的以冒号分隔的审计接口列表。如果链接器在搜索共享库时发现带有审计条目的对象,它将在输出文件中添加相应的“DT_DEPAUDIT”条目。此选项仅在支持 rtld-audit 接口的 ELF 平台上有意义。

这向我表明,如果我使用 链接我的程序--audit audit.so,那么它应该将我的审计库与该程序相关联。我希望在程序运行时加载审计库。

果然,使用readelf,我可以验证使用这个标志会导致audit.so在 ELF 标头中注册为审计库。但是,如果我在没有LD_AUDIT设置的情况下运行我的程序,则永远不会调用审计库。似乎我必须设置LD_AUDIT=audit.so才能获得我想要的行为。

这就引出了一个问题:--audit旗帜实际上有什么作用?上面手册页引用之外的任何文档似乎都非常稀缺。我不清楚 Linux 动态加载器甚至使用DT_AUDITELF 标头中的字段。这是故意的吗?

linux glibc shared-libraries elf ld

4
推荐指数
1
解决办法
619
查看次数

如何查看我的gcc版本?

In file included from /usr/include/c++/4.8.2/locale:41:0,
                 from /usr/include/c++/4.8.2/iomanip:43,
                 from [...omitted by myself as it is irrelevant]
/usr/include/c++/4.8.2/bits/locale_facets_nonio.h:59:39: error: ‘locale’ has not been declared
     struct __timepunct_cache : public locale::facet
Run Code Online (Sandbox Code Playgroud)

以上是我的构建日志中的第一个错误.

我没有尝试自己编译glibc/gcc,我通过yum安装它们.

我找到的一个可疑的事情是:

$ ll /usr/include/c++/
total 4
drwxr-xr-x. 12 root root 4096 Dec 17 14:16 4.8.2
lrwxrwxrwx   1 root root    5 Dec 17 14:16 4.8.5 -> 4.8.2
$
Run Code Online (Sandbox Code Playgroud)

yum只显示了1个版本的gcc:

$ yum info gcc-c++
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: centos.uhost.hk
 * epel: mirrors.hustunique.com
 * extras: centos.uhost.hk …
Run Code Online (Sandbox Code Playgroud)

c++ gcc g++4.8 centos7

4
推荐指数
1
解决办法
2万
查看次数