首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

xmake v2.3.4 发布, 更加完善的工具链支持

其实平台和工具链是完全可以独立开来的,新版本经过重构后,即使是windows平台以及其他任何平台,也可以方便快速的切换到clang, llvm等其他工具链。...比如,我们要从默认的gcc切换到clang编译,可能需要切一些工具集,xmake f --cc=clang --cxx=clang --ld=clang++ --sh=clang++,因为编译器切了,对应的链接器...,静态库归档器什么的都得同时切才行。...这也是推荐做法,因为像gcc/clang等大部分编译工具链,编译器和链接器都是配套使用的,要切就得整体切,单独零散的切换设置会很繁琐。...实现更完善的工具链设置,并且实现platform和toolchains分离 #798: 添加xmake show插件去显示xmake内置的各种信息 #797: 添加ninja主题风格,显示ninja风格的构建进度条

1.4K20

iOS 裁包大作战 —— JOOX Music 如何瘦身40MB

例如下图是 JOOX 链接 Ford 车载系统时用的背景图,可以看到上面有丰富的纹理。产品和设计童鞋权衡了曝光率、切图大小以及视觉等方面的因素,决定把这张切图换成全黑。这下连切图都省了,一行代码搞定。...Mach-O 是一种用于记录可执行文件、对象代码、共享库、动态加载代码和内存转储的文件格式。...2.1.2.2 otoolotool 是一个反编译工具,可以提取并显示 iOS 可执行文件的相关信息,包括头部,加载命令,各个段,动态库等。...具体的实现方法可参考:《基于clang插件的一种iOS包大小瘦身方案》2.2 删除静态库中无用的 Mach-O 文件前文提到:编译的时候,链接器通常只会把静态库中被我们使用到的部分加载进来,除非我们配置了某些...而且使用裁剪后的静态库打出来的包,体积减小了很多,基本和不使用 -all_load 强制链接器加载 TestClassB 时打出来的包的大小一致(为了试验方便,我把 TestClassB 弄得比较大,这样体积变化比较明显

94840
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android对so体积优化的探索与实践

    使用 exclude libs 移除静态库中的符号 上述 visibility 方式、attribute 方式和 static 关键字,都是控制项目源码中符号的可见性,而无法控制依赖的静态库中的符号在最终...LTO 能够在链接目标文件时检测出 DeadCode 并删除它们,从而减小编译产物的体积。DeadCode 举例:某个 if 条件永远为假,那么 if 为真下的代码块就可以移除。...能够在链接期做优化的原因是,在编译期很多信息还不能确定,只有局部信息,无法执行一些优化。但是链接时大部分信息都确定了,相当于获取了全局信息,所以可以进行一些优化。...: 如果使用 Clang,编译参数和链接参数中都要开启 LTO,否则会出现无法识别文件格式的问题(NDK22 之前存在此问题)。...其原理是,链接时链接器对每个符号进行 demangle(解构,即把修饰后的符号还原为可读的表示),然后与 extern "C++" 中的条目进行匹配,如果能与任一条目匹配成功就保留该符号。

    2.7K31

    详解共享库的动态加载

    什么是共享库 库是一个包含编译后的代码和数据的文件。一般来说,库非常有用,因为它们可以缩短编译时间(在编译应用程序时不必编译依赖关系的所有源代码)和模块化开发过程。...静态库链接到已编译的可执行文件(或另一个库)中。编译后,新组件将包含静态库的内容。 共享库在运行时由可执行文件(或其他共享库)加载。...在编译实际库之前,我们将从random.cpp创建一个目标文件: $ clang++ -o random.o -c random.cpp 通常,一切正常后,构建工具不会打印到标准输出。...因此,我们需要让我们clang知道在哪里搜索共享库。我们用-L参数来做到这一点。请注意,由指定的路径-L仅在链接时影响搜索路径,而不会在运行时影响。...ELF - 可执行和可链接的格式 共享库和可执行文件格式称为ELF(可执行和可链接格式)。如果您查看Wikipedia文章,您会发现它是一团糟,因此我们不会一一列举。

    3.2K20

    iOS编译原理

    :以便于编译时编译器能够显示警告和错误的所在行号; 2.查看预处理结果 使用xcrun命令,在终端执行预处理操作: xcrun clang -E main.m 终端显示效果如下: # 1 "main.m...词法分析(Lexical Analysis) 主要功能:通过扫描器,分割识别源代码符号(如大小括号、=、字符串); 使用xcrun命令,在终端执行词法分析操作: xcrun clang -fmodules...symbols"; 另外,链接器在整理函数的符号调用关系时,可以帮助我们理清那些函数没有被调用,并自动去除掉; 2.重定位 将变量名、函数名这些符号定义与一个内存位置关联起来; 因为只有通过了绑定,机器才知道需要操作什么内存地址...; 5.理解静态链接与动态链接 静态链接:作用于编译期,链接后的文件依然可能会存在一些"undefined"的符号。...但是这些符号都会被记录下来,在运行时再通过dlopen和dlsym动态链接绑定; 动态链接:作用于运行时,这样的优势在于:诸多类似UIKit这样的共享库将不必包含在每一个App包里。

    1.6K20

    CSAPP---第七章-链接

    CSAPP---第七章-链接 什么是链接 目标文件 目标文件格式 可重定位目标文件格式 符号和符号表 符号解析 多重定义全局符号处理 静态库 静态库解析过程 重定位 重定位条目 可执行文件...,那么链接器就尝试匹配U中未解析的符号和由静态库文件中成员定义的符号,如果在某个静态库文件成员m中定位到了U中某个未解析的符号,那么就将m添加到E中,并通过修改U和D来反映m中的符号定义和引用。...注意:如果定义一个符号的库出现在引用这个符号的目标文件之前,那么引用就不能被解析,链接会失败。...当源代码经过编译生成可重定位目标文件后,其中无法识别的符号引用,对应的call调用或者引用地址会被设置为0,等到链接重定位时进行地址。修正 代码的重定位条目放在 .rel.text 中。...更进一步地说,在运行时无需停止服务器,就可以更新已存在的函数,以及添加新的函数。 Linux 系统为动态链接器提供了一个简单的接口,允许应用程序在运行时加载和链接共享库。

    92110

    xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成

    这是用来干什么的呢,做过交叉编译以及有 C/C++ 项目移植经验的同学应该知道,折腾各种交叉编译工具链,移植编译项目是非常麻烦的一件事,需要自己下载对应工具链,并且配置工具链和编译环境很容易出错导致编译失败...甚至对于 C/C++ 依赖包的集成,也可以自动切换到对应工具链编译安装集成,一切完全自动化,完全不需要用户操心。...大体意思就是: 启用此布尔属性,可以自动创建一个模块定义(.def)文件,其中包含在Windows上的共享库(或使用ENABLE_EXPORTS的可执行文件)的输入.obj文件中找到的所有全局符号。...模块定义文件将被传递给链接器,使所有符号从.dll中导出。对于全局数据符号,当对.dll中的代码进行编译时,仍然必须使用__declspec(dllimport)。...: 改进规则支持新的批处理命令去简化自定义规则实现 #1239: 添加 add_extsources 去改进外部包的查找 #1241: 支持为 windows 程序添加 .manifest 文件参与链接

    1.8K10

    Linux系统基础(一篇搞定基本应用)

    :存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账户命名的 /root:该目录为系统管理员,也称为超级权限者的用户主目录 /lib:系统开机所需要基本的动态连接共享库...,其作用类似于Windows里的DLL文件,集合所有的应用程序都需要用到这些共享库 /lost+found:这个目录一般情况是空的,当系统非法关机后,这里就存放一些文件 /etc:所有的系统管理员所需要的配置文件和子目录...软链接也称为符号链接,类似于 windows 里的快捷方式,有自己的数据块,主要存放 了链接其他文件的路径 ln -s [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接) 删除软链接...4.5、切换用户(swith user) su 用户名称:切换用户,只能获得用户的执行权限,不能获得环境变量 su - 用户名称:切换到用户并获得该用户的环境变量及执行权限 4.6、userdel 删除用户...mypackage.zip 2、解压mypackage.zip到指定目录 8.3、tar 打包 基本语法:tar [选项] XXX.tar.gz 将要打包进去的内容(打包目录,压缩后的 文件格式.tar.gz

    9110

    “C不再是一种编程语言”

    换句话说,即使你从未用 C 编写任何代码,你也必须处理 C 变量、匹配 C 数据结构和布局、通过名称和符号链接到 C 函数。这不仅适用于任何语言与操作系统的交互,也适用于从一种语言调用另一种语言。...这里测试的是一些非常令人厌烦的情况,即一些整型参数在两个由 clang 和 gcc 编译的静态库之间按值传递……而且失败了!...任何人在针对你的头文件进行编译时,如果是针对新版本就使用符号 v2,而针对旧版本则继续使用 v1! 但仍然有一个兼容性问题:任何针对新的头文件所做的编译都不能与旧版本的库进行链接!...库的 v1 版本根本没有 v2 符号。所以,如果你想要热门的新功能,就需要接受与旧有系统不兼容的事实。...如果需要在末尾添加更多的字段,那也没关系,因为旧版本可以使用这个值来检测头的“版本”,并跳过任何它们不识别的字段。 SizeOfDescriptor 是数组中每个元素的大小。

    57920

    “C不再是一种编程语言”

    换句话说,即使你从未用 C 编写任何代码,你也必须处理 C 变量、匹配 C 数据结构和布局、通过名称和符号链接到 C 函数。这不仅适用于任何语言与操作系统的交互,也适用于从一种语言调用另一种语言。...这里测试的是一些非常令人厌烦的情况,即一些整型参数在两个由 clang 和 gcc 编译的静态库之间按值传递……而且失败了!...任何人在针对你的头文件进行编译时,如果是针对新版本就使用符号 v2,而针对旧版本则继续使用 v1! 但仍然有一个兼容性问题:任何针对新的头文件所做的编译都不能与旧版本的库进行链接!...库的 v1 版本根本没有 v2 符号。所以,如果你想要热门的新功能,就需要接受与旧有系统不兼容的事实。...如果需要在末尾添加更多的字段,那也没关系,因为旧版本可以使用这个值来检测头的“版本”,并跳过任何它们不识别的字段。 SizeOfDescriptor 是数组中每个元素的大小。

    66121

    C 不再是一种编程语言

    它意味着以C头文件的形式获得接口类型和功能的描述,并以某种方式: 匹配这些类型的布局 用链接器做一些事情,将函数的符号解析为指针 用适当的ABI来调用这些函数(比如把args放在正确的寄存器中) 那么,...结果发现,一些整数参数在两个由Clang和GCC编译的静态库之间按值传递失败了! Aria发现,Clang和GCC甚至不能就Linux x64上_int128的ABI达成一致。...如果这一切是无论如何都无法避免的灾难,你还不如开始手工翻译类型和接口定义到你的语言中,基本上就是我们每天在Rust中所做的事情。...但是你仍然有一个兼容性的问题:任何用新头文件编译的人都不能与库的旧版本进行链接,库的V1版本根本没有V2符号!因此,如果你想获得热门的新功能,你就要接受与旧系统的不兼容。...但为了人们愿意依赖它并中断对旧平台的支持(或者愿意为它实施动态检查和回退)时,你必须坐等几年。 如果你真的想让人们立即升级,那就要谈论向前兼容的问题。

    69730

    深入剖析 iOS 编译 Clang LLVM

    -x 后加个 c 表示是对 c 语言进行编译,Clang Driver 通过文件的后缀 .c 来自动加上这个 参数的。如果是 c++ 语言,仅仅通过在 -x 后添加 cpp 编译还是会出错的。...,对象代码,共享库,动态加载代码和内存转储的文件格式。...- Jun’s Blog,作者另一篇文章: iOS符号表恢复&逆向支付宝 - Jun’s Blog dyld动态链接 生成可执行文件后就是在启动时进行动态链接了,进行符号和地址的绑定。...,所以在目标文件和 Fundation framework 动态库做链接处理时,链接器会尝试解析所有的 undefined 符号。...其它的库还会再依赖更多的库,这样相互依赖的符号会很多,需要处理的时间也会比较长,这里系统上的动态链接器会使用共享缓存,共享缓存在 /var/db/dyld/。

    8K20

    C 不再是一种编程语言

    它意味着以C头文件的形式获得接口类型和功能的描述,并以某种方式: 匹配这些类型的布局 用链接器做一些事情,将函数的符号解析为指针 用适当的ABI来调用这些函数(比如把args放在正确的寄存器中) 那么,...结果发现,一些整数参数在两个由Clang和GCC编译的静态库之间按值传递失败了! Aria发现,Clang和GCC甚至不能就Linux x64上_int128的ABI达成一致。...如果这一切是无论如何都无法避免的灾难,你还不如开始手工翻译类型和接口定义到你的语言中,基本上就是我们每天在Rust中所做的事情。...但是你仍然有一个兼容性的问题:任何用新头文件编译的人都不能与库的旧版本进行链接,库的V1版本根本没有V2符号!因此,如果你想获得热门的新功能,你就要接受与旧系统的不兼容。...但为了人们愿意依赖它并中断对旧平台的支持(或者愿意为它实施动态检查和回退)时,你必须坐等几年。 如果你真的想让人们立即升级,那就要谈论向前兼容的问题。

    76410

    二进制重排

    获取App启动时调用的所有方法(使用编译插桩) 备注:Clang插桩实际上就是一个代码覆盖工具 Clang插桩官网地址 要真正的实现二进制重排,我们需要拿到启动时的所有方法、函数等符号,并保存其顺序,然后写入...3.2 添加完编译配置后,会发现编译报错,如下: 3.3 添加Clang函数 #import "DZHomeViewController.h" #import // 动态库的显式调用...; //进入 OSAtomicEnqueue(&symbolList, node, offsetof(DeziNode, next)); Dl_info info; // 动态链接库时...所以在编译时刻,Clang插桩会静态加入汇编指令,做到全局AOP,Hook一切方法。...undefined 点击录制⏺后,出现第一个页面,马上停止⏹。过滤只显示Main Thread相关,选择Summary: Virtual Memory。

    1.6K45

    解决:无法解析的外部符号__iob_func

    解决: 无法解析的外部符号 __iob_func在使用C/C++编程语言进行项目开发时,有时可能会遇到编译错误,其中一个常见的错误是无法解析的外部符号__iob_func。...如果路径不正确,可以使用以下命令来添加正确的路径:bashCopy code-L /path/to/libc3. 检查链接器选项检查链接器选项是否正确配置。链接器在链接时需要找到标准库函数的实现。...确保所有代码文件都正确包含了所需的头文件,并且在链接时提供了正确的库。总结无法解析的外部符号__iob_func错误通常是由于编译器和链接器之间的配置问题所引起的。...当编译这个示例代码时,可能会遇到“无法解析的外部符号__iob_func”错误。这是因为编译器无法找到标准库函数的实现导致的。...在命令行上运行编译器可执行文件时,可能会显示版本信息或者与版本相关的信息。 以上方法提供了一些常见的检查编译器版本的方式,你可以根据使用的具体编译器来尝试这些方法。

    92610

    Git 中文参考(八)

    默认情况下,显示标签,磁头和远程参考。 –exclude-existing 表单是一个反向的过滤器。它从 stdin 读取 refs,每行一个 ref,并显示本地存储库中不存在的那些。...--replace 默认情况下,当索引中存在文件path时, git update-index 拒绝添加path/file的尝试。同样,如果存在文件path/file,则无法添加文件path。...在 2.17 之前,未跟踪的缓存有一个错误,将带有符号链接的目录替换到另一个目录可能会导致错误地将 git 跟踪的文件显示为未跟踪。...请参阅“状态:添加一个显示 core.untrackedCache 错误的失败测试”提交到 git.git。...如果当前用户无法创建新日志文件,附加到现有日志文件或没有可用的提交者信息,则更新将失败(不更改)。

    16410

    进制重排

    获取App启动时调用的所有方法(使用编译插桩) 备注:Clang插桩实际上就是一个代码覆盖工具 Clang插桩官网地址 要真正的实现二进制重排,我们需要拿到启动时的所有方法、函数等符号,并保存其顺序,然后写入...3.2 添加完编译配置后,会发现编译报错,如下: 3.3 添加Clang函数 #import "DZHomeViewController.h" #import // 动态库的显式调用...; //进入 OSAtomicEnqueue(&symbolList, node, offsetof(DeziNode, next)); Dl_info info; // 动态链接库时...所以在编译时刻,Clang插桩会静态加入汇编指令,做到全局AOP,Hook一切方法。...undefined 点击录制⏺后,出现第一个页面,马上停止⏹。过滤只显示Main Thread相关,选择Summary: Virtual Memory。

    66320

    iOS逆向之Mach-O文件

    在OS X中,内核扩展、命令行工具、应用程序、框架和库(共享的和静态的)都是使用Mach-O(Mach object)文件实现的。综上,Mach-O文件是一种文件格式、一种文件标准。...,如下:[使用MachOView查看部分LC_LOAD_DYLIB加载命令]动态链接共享库通过两个要素来标识。...o目标文件:源文件编译而成的目标文件.a静态库文件:由多个.o文件编译链接合并而成的文件我们可以借助clang命令将C语言的.c文件和OC的.m文件编译成.o目标文件:clang -c C文件.c -o...动态库不能直接运行,而是需要通过系统的动态链接加载器进行加载到内存后执行,动态链接加载器在系统中以一个用户态的可执行文件形式存在,一般应用程序会在Mach-O文件部分指定一个LC_LOAD_DYLINKER...ldid还为二进制签名生成SHA1散列,因此iPhone内核可执行修改后的二进制。Cydia中的包名为“链接身份编辑器”,由Cydia/Telesphoreo存储库托管。

    10.9K10
    领券