动态库

Linux下__attribute__((visibility ("default")))的使用

倖福魔咒の 提交于 2020-01-25 08:58:58
在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号。在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数、变量、模板以及C++类。 限制符号可见性的原因:从动态库中尽可能少地输出符号是一个好的实践经验。输出一个受限制的符号会提高程序的模块性,并隐藏实现的细节。动态库装载和识别的符号越少,程序启动和运行的速度就越快。导出所有符号会减慢程序速度,并耗用大量内存。 “default”:用它定义的符号将被导出,动态库中的函数默认是可见的。”hidden”:用它定义的符号将不被导出,并且不能从其它对象进行使用,动态库中的函数是被隐藏的。default意味着该方法对其它模块是可见的。而hidden表示该方法符号不会被放到动态符号表里,所以其它模块(可执行文件或者动态库)不可以通过符号表访问该方法。 要定义GNU属性,需要包含__attribute__和用括号括住的内容。可以将符号的可见性指定为visibility(“hidden”),这将不允许它们在库中被导出,但是可以在源文件之间共享。实际上,隐藏的符号将不会出现在动态符号表中,但是还被留在符号表中用于静态链接。 导出列表由编译器在创建共享库的时候自动生成,也可以由开发人员手工编写。导出列表的原理是显式地告诉编译器可以通过外部文件从对象文件导出的符号是哪些

learning gcc args

纵然是瞬间 提交于 2020-01-25 08:41:24
参数详解 无选项编译链接 将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 例子用法: gcc test.c 无选项链接 gcc test.o -o test 将编译输出文件test.o链接成最终可执行文件test。 -x language filename   设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。   可以使用的参数吗有下面的这些   `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'.   看到英文,应该可以理解的。   例子用法:   gcc -x c hello.pig -x none filename   关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型   例子用法:   gcc -x c hello.pig -x none hello2.c -c   只激活预处理,编译,和汇编,也就是他只把程序做成obj文件   例子用法:   gcc -c

gcc/g++命令认识

醉酒当歌 提交于 2020-01-25 07:59:23
gcc & g++是gnu中最主要和最流行的c & c++编译器 。 g++用来针对c++的处理命令,以.cpp为后缀,对于c语言后缀名一般为.c。这时候命令换做gcc即可。 下面以Test.cpp为例: 命令: g++ Test.cpp 功能:生成默认为 a的可执行文件,这个过程已经包含了编译和链接过程。 再说下-o命令, -o命令表示输出的意思,gcc/g++命令是非常灵活的,你不指定输出的文件名的时候默认生成的是可执行文件。 你要输出Test的可执行程序的话可以用: g++ -o Test Test.cpp 或者g++ Test.cpp -o Test即可。 -o命令是输出的意思,这样就输出了名为Test的可执行程序。 1.预处理,生成.i的文件[预处理器cpp] 命令:g++ -E Test.cpp > Test.i 功能:输出预处理后 的文件,linux下以.i为后缀名。只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 。这一步主要做了这些事情:宏的替换,还有注释的消除,还有找到相关的库文件。用编辑器打开Test.i会发现有很多很多代码,你只需要看最后部分就会发 现,预处理做了宏的替换,还有注释的消除,可以理解为无关代码的清除。 下面是Test.i文件的最后部分,可以看见宏的替换和注释的消除。 2.将预处理后的文件不转换成汇编语言,生成文件.s

编译libfdk-aac

我们两清 提交于 2020-01-25 02:37:20
经验的误区 fdk-aac项目中并没有直接提供vs下的编译工程,也没有CmakeList 脚本。所以我凭经验判断,源码是需要在mingw环境下编译。正是这种直观,简单的判断,直接在编译上挖了个坑。 我用mingw很顺利编译出了libfdk-aac.a库,结果在链接到执行程序时出错了,错误如下: (fft.o) : fatal error LNK1143: 无效或损坏的文件: 没有 COMDAT 0x7 节的符号 这个错误的意思是指msvc的链接器不认识fft.o这个目标文件。一般的,mingw产生的静态库是可以被msvc链接的,前提是提供的C接口,并且用了extern c修饰。fdk-aac的接口风格也是如此。应该不会出现这个问题。 所以我直接蒙圈了。 解决方案 在网上找一圈,始终找不到解决方法。只能硬着头皮去看Makefile脚本,结果终于找到了解决方法。 fdk-aac其实提供了在windows下的一个编译脚本Makefile.vc,使用msvc nmake去编译即可。 再次遇到问题 在vs2015提供命令工具中直接进入fdk-aac的源码目录,使用如下命令进行编译 nmake -f Makefile.vc all 该脚本编译出静态库,动态库,产生动态库接口导出文件 fdk-aac.lib fdk-aac-1.dll fdk-aac.dll.lib fdk-aac.def

运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

孤街浪徒 提交于 2020-01-24 20:49:04
   运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory -------------------------------------------------------------------------------------------------------------------------------------------------   首先说明一下,这个题目有点长,但是却很好地反应了遇到的问题点。   在《如何用C代码生成二维码》一文中,小编也向大家展示了在正确无误地编译好qrcode_test程序后,运行报错的问题。这次我们再拿出来说一说。 当时在终端手动./运行程序报错的提示 ./qrcode_test: error while loading shared libraries: libzint.so.2.4: cannot open shared object file: No such file or directory   大概的意思就是在运行程序的时候,没有找到程序所需的libzint.so动态库。大家都知道,动态库与静态库的最大区别就是:静态库是 静态链接

python打包工具pyinstaller的使用

时光怂恿深爱的人放手 提交于 2020-01-24 13:54:41
安装PyInstaller pip install pyinstaller 安装完后,检查安装成功与否: pyinstaller --version 安装成功后,就可以使用下面的命令了: pyinstaller : 打包可执行文件的主要命令,详细用法下面会介绍。 pyi-archive_viewer : 查看可执行包里面的文件列表。 pyi-bindepend : 查看可执行文件依赖的动态库(.so或.dll文件) pyi-... : 等等。 使用PyInstaller pyinstaller 的语法: pyinstaller [options] script [script ...] | specfile 最简单的用法,在和myscript.py同目录下执行命令: pyinstaller mycript.py 然后会看到新增加了两个目录build和dist,dist下面的文件就是可以发布的可执行文件,对于上面的命令你会发现dist目录下面有一堆文件,各种都动态库文件和myscrip可执行文件。有时这样感觉比较麻烦,需要打包dist下面的所有东西才能发布,万一丢掉一个动态库就无法运行了,好在pyInstaller支持单文件模式,只需要执行: pyinstaller -F mycript.py 主要使用 你会发现dist下面只有一个可执行文件,这个单文件就可以发布了

CVE-2019-0708-EXP之Windows版

时光毁灭记忆、已成空白 提交于 2020-01-24 05:49:40
CVE-2019-0708-EXP-Windows-Version 申明 作者poc仅供研究目的,如果读者利用本poc从事其他行为,与本人无关 目录 文章目录 CVE-2019-0708-EXP-Windows-Version 申明 目录 介绍 复现环境 使用说明 安装教程 Openssl编译环境安装教程 Nasm编译环境安装教程 运行效果 项目托管 参与贡献 介绍 CVE-2019-0708-EXP-Windows版单文件exe运行,无需linux,python,ruby等,运行后直接在当前控制台反弹System权限Shell 编译采用全静态库模式内联所有dll,集成netcat和openssl,支持进度条显示,shell回显操作 复现环境 被攻击者操作系统Victim:Windows 7 sp1 x64位操作系统 攻击者操作系统Attacker:Windows 10 x64位操作系统 编译环境Visual Studio 2013 使用说明 进入CVE-2019-0708-EXP-Release目录 运行wfreerdp.exe /v:Victim_IP /l:Attacker_IP,如wfreerdp.exe /v:10.120.1.160 /l:10.120.1.17 安装教程 复制FreeRDP-master项目至E:\git\KernelResearch\FreeRDP

搭建企业级npm服务

六眼飞鱼酱① 提交于 2020-01-24 03:33:42
为什么要搭建npm企业私服   1、确保npm服务快速、稳定:对于企业来说,开发的时候,需要花半小时甚至更久等待npm模块依赖安装完毕,是不可接受的。部署镜像后,可以确保高速、稳定的npm服务。   2、发布私有模块:官方的npm上的模块全部是开源的。一些与企业业务逻辑相关的模块可能不适合开源。这部分私有的模块放在私有NPM仓库中,使用起来各种方便。   3、控制npm模块质量和安全:npm上的模块质量参差不齐,搭建私有仓库,可以更严格地控制模块的质量和安全   4、有些npm上面的包你希望更改源码二次开发而无从下手的时候,你只需要修改源码后需改为更高版本发布到私服上就可以使用维护了 mac上测试 sinopia 安装 cnpm i sinopia -g 启动 sinopia warn --- config file - /Users/**/.config/sinopia/config.yaml warn --- http address - http://localhost:4873/ 注意:上面输出的两条信息相当重要 服务器中 sinopia 的配置文件存放的位置,后期的配置都需要修改这个文件 sinopia 提供服务的地址,默认4873 sinopia 就搭建完成了,还能更简单么?No。 配置 sinopia sinopia 搭建完成后就可以发布 npm 包了, npm

将Python脚本打包成可执行文件

老子叫甜甜 提交于 2020-01-23 10:35:34
http://www.cnblogs.com/mywolrd/p/4756005.html 将Python脚本打包成可执行文件 Python是一个脚本语言,被解释器解释执行。它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的) .pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发布后也是跨平台的,需要使用者安装相应版本的Python和依赖库。 可执行文件:对于非码农用户或者一些小白用户,你让他装个Python同时还要折腾一堆依赖库,那简直是个灾难。对于此类用户,最简单的方式就是提供一个可执行文件,只需要把用法告诉Ta即可。比较麻烦的是需要针对不同平台需要打包不同的可执行文件(Windows,Linux,Mac,...)。 本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstaller,其它仅作比较和参考。 Freezing Your Code 各种打包工具的对比如下(来自文章 Freezing Your Code ): Solution Windows Linux

将Python脚本打包成可执行文件

混江龙づ霸主 提交于 2020-01-21 14:45:22
Python是一个脚本语言,被解释器解释执行。它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的) .pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发布后也是跨平台的,需要使用者安装相应版本的Python和依赖库。 可执行文件:对于非码农用户或者一些小白用户,你让他装个Python同时还要折腾一堆依赖库,那简直是个灾难。对于此类用户,最简单的方式就是提 供一个可执行文件,只需要把用法告诉Ta即可。比较麻烦的是需要针对不同平台需要打包不同的可执行文件(Windows,Linux,Mac,...)。 本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstaller,其它仅作比较和参考。 Freezing Your Code 各种打包工具的对比如下(来自文章 Freezing Your Code ): Solution Windows Linux OS X Python 3 License One-file mode Zipfile import Eggs pkg