我有一个C++库,可以生成更大的代码,我真的期望它正在做什么.从不到50K的源代码行中,我获得了大约4 MB的共享对象和静态归档推送9.这是有问题的,因为库二进制文件非常大,更糟糕的是,甚至连接它的简单应用程序通常会获得500到1000 KB代码大小.使用像-Os这样的标志编译库有点帮助,但不是很多.
我还尝试了GCC的-frepo命令(尽管我见过的所有文档都表明Linux上的collect2将会合并重复的模板)和模板上的显式模板实例化似乎"可能"重复很多,但是没有两种情况都有实际效果.当然,我说"可能",因为,与任何类型的剖析一样,这样的盲目猜测几乎总是错误的.
是否有一些工具可以轻松地分析代码大小,或者其他一些方法我可以找出占用这么多空间的东西,或者更一般地说,我应该尝试的其他任何东西?在Linux下工作的东西是理想的,但我将采取我能得到的东西.
这个非常简单的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) 我正在寻找一种枚举所有ELF节及其当前二进制文件的地址以及当前进程可能已加载的所有共享对象的好方法。
我知道dl_iterate_phdr()的存在,这使我可以轻松使用ELF 段列表,但是我正在寻找ELF 节,所以这不是我的正确选择。
我不关心可移植性,只要它可在带有ELF的Linux上运行,我就很高兴!
任何提示表示赞赏!
我正在研究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)
谁能帮我吗?有没有任何方法来预过滤类别?
简单的C文件:
#include <stdio.h>
int main(){
printf("Hello World");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译代码后,使用readelf -a a.out
,精灵信息如下:
问题:
我有一个需要在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) 我想获得gcc
的ld
来自编译一堆对象文件放在一起时共享库忽略未解决的参考-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
,将所有目标文件存储在.a
with 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) 我从服务器收到一些文本,其中可能包含一些主题标签,当显示此文本时,我想用链接转换这些标签。
示例文本为:“今天#天气非常好”
以下代码将字符串转换为
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 这种方法,但它期望整个字符串是一个链接,而不是一些文本和一些链接。
我有一个应用程序,我想使用rtld-audit
Linux 提供的接口来挂钩共享库加载过程。如果我在运行程序时使用LD_AUDIT
环境变量告诉动态链接器使用我的审计库audit.so
,这将非常有效。
但是,我想让它更加自动化,不需要特殊的环境设置。GNUld
提供了一个--audit
标志,描述如下:
Run Code Online (Sandbox Code Playgroud)--audit AUDITLIB
将 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_AUDIT
ELF 标头中的字段。这是故意的吗?
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)