Articles of gcc

__attribute __((构造函数))调用顺序混淆

这里的答案表明__attribute __((构造函数)) 在静态初始化之后不被调用,它在声明顺序中被调用。 那么,如果在初始化所有数据时不能保证被调用,那么它的目的是什么呢? 我们可以在Foo构造函数中拥有我们的((构造函数))代码。 我正在寻找的是在共享库中有一个代码,在所有静态数据初始化并调用静态构造函数之后执行。 我看到有人推荐__attribute __((构造函数))来代替DllMain; 因为我们可以看到这是错误的,因为一些静态数据可能还没有被初始化。 当然,在单个文件(编译单元)中,我们可以安排静态。 但在典型的程序中有很多文件。 有一种方法可以保证((构造函数))在一个共享库中的所有其他静态都被初始化之后肯定会被调用吗? 如果我把静态初始化(构造函数,对象等)的文件放在gcc命令行的末尾: g++ -shared -fPIC source1.o source2.o MyLastInitChance.o 这个文件的静态构造函数保证被称为最后? 我尝试过,当我改变源文件的顺序时,printfs的顺序被改变了; 但它是指定的地方,并保证在编译系统/计算机是相同的? 例如,一个报价: 在链接时,gcc驱动程序立即在所有可重定位文件和crtend.o之前的所有可重定位文件之后立即放置crtbegin.o。 © 从我理解上面的引用意味着传递给链接器的.o文件的顺序定义了静态初始化的顺序。 我对么? 另一个有趣的可能的解决scheme可能是编写一个GCC插件来调整静态初始化(例如将代码添加到.ctors部分等)。 但这只是一个可能有人可以延伸的想法。 这里介绍另一个可能的解决scheme。 简而言之,可以使用外部后构build工具对可执行文件(库)中的.ctors条目进行重新sorting。 但我不是ELF格式的专家; 我想知道这是否可能和容易,以这种方式调整.so文件。 我感兴趣的是解决一个特定的问题,或者certificate不可能解决(至less为什么上面的解决scheme不起作用)。

configuration:错误:安装Ruby 1.9.3时,C编译器无法创build可执行文件

尝试在Trisquel 6上使用以下命令rvm install 1.9.3安装Ruby 1.9.3时出现以下错误 错误 运行'./configure时出错 –prefix = / home / joshua / .rvm / rubies / ruby​​-1.9.3-p448 –disable-install-doc –enable-shared',请阅读/home/joshua/.rvm/log/1379507772_ruby-1.9 .3-p448 / configure.log有 运行configure时出错。 停止安装。 我的configure.log显示在下面 [2013-09-18 20:36:16] ./configure当前path: /home/joshua/.rvm/src/ruby-1.9.3-p448命令(4):./configure –prefix = / home / joshua / .rvm / rubies / ruby​​-1.9.3 -p448 –disable- install-doc –enable-shared 检查构build系统types… i686-pc-linux-gnu检查主机系统types… i686-pc-linux-gnu 检查目标系统types… i686-pc-linux-gnu 检查gcc … gcc […]

gcc / g ++中__declspec(naked)的等价物

gcc / g ++中__declspec( naked )的等价物是什么? __declspec( naked )实际上用于声明一个没有任何结尾和序言的函数。

从可执行文件中删除所有符号表和重定位信息的影响?

使用gcc -s和Unix strip进行gcc -s ,从可执行文件中删除所有符号表和重定位信息(使其尺寸更小)。 这可能会影响可执行文件的function吗? 做一些执行ASLR的操作系统需要这些信息吗? 如果没有,为什么要把他们放在首位呢? 稍微详细的上述概述将会有所帮助。

STL和释放/debugging库混乱

我正在使用一些第三方。 我使用的是共享库版本,因为库很大(〜60MB),并被多个应用程序使用。 有没有办法在应用程序启动找出发行版/debugging版本的库分别用于我的应用程序的发布/debugging版本? 更长的描述 暴露C ++接口的库。 API方法之一返回std::vector<std::string> 。 当我在debugging模式下编译我的应用程序时,应该使用库的debugging版本。 相同的发布。 如果使用的库的版本不正确,则应用程序崩溃。 根据gcc(见http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt03ch17s04.html ) 但是使用混合模式标准库可能会使用debugging模式或释放模式basic_string对象,事情变得更加复杂 PS 1 它看起来像Timbo的提案是一个可能的解决scheme – 使用不同的sonamedebugging和发布图书馆。 那么,应该传递给./configure脚本来改变库soname呢? PS 2 我的问题不在于链接时间,而是在运行时。 PS 3 这是certificate我面临的问题的问题。

任何方式来指定configuration文件数据的位置

configuration文件是从可执行文件中运行的默认文件,名为gmon.out 。 有什么办法指定一个新的位置? 我在i386 / linux2.6上使用gcc 3.4.6

为什么glibc和pthread库都定义了相同的API?

为什么glibc和pthread库都定义了相同的API? 这是快照 ubuntu@ubuntu:/lib$ objdump -T /lib/i386-linux-gnu/libc.so.6 |grep pthread_cond_signal 000f8360 g DF .text 00000039 GLIBC_2.3.2 pthread_cond_signal 0012b940 g DF .text 00000039 (GLIBC_2.0) pthread_cond_signal ubuntu@ubuntu:/lib$ objdump -T /lib/i386-linux-gnu/libpthread.so.0 |grep pthread_cond_signal 0000b350 g DF .text 0000007c (GLIBC_2.0) pthread_cond_signal 0000af90 g DF .text 000000fc GLIBC_2.3.2 pthread_cond_signal

从Visual Studio Solution生成Make文件(用于GCC)

我想在Linux下使用GCC编译我的Visual Studio解决scheme ,包含三个项目。 该解决scheme包含两个DLL项目和一个使用这些DLL的应用程序(.EXE)项目 。 源代码不包含任何Windows依赖项。 如何将解决scheme(包含3个项目)转换成可以在Linux中使用GCC编译的文件。 是否有任何工具将Visual Studio解决scheme(项目)转换为文件。 Visual Studio版本是Visual Studio 2008

提升日志,GCC 4.4和CMake

我正在尝试使用GCC 4.4.5,CMake 2.8.2和Boost 1.53.0在Linux上运行一个简单的boost.log示例。 编译boost和boost日志成功了,但是当我的testing程序连接到boost.log时,我一直在收到问题。 我使用下面的CMakeLists.txt文件: cmake_minimum_required(VERSION 2.8) project(QuantibBoostLogTest) # Include boost headers set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) find_package(Threads) find_package(Boost 1.53.0 COMPONENTS thread date_time filesystem system log log_setup REQUIRED) if(Boost_FOUND) include_directories( ${Boost_INCLUDE_DIRS} ) link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) else(Boost_FOUND) message(FATAL_ERROR "Cannot build Quantib Boost Log test without Boost. Please set Boost_DIR.") endif(Boost_FOUND) add_executable(quantibBoostLogTest boost_log_test.cxx) install(TARGETS quantibBoostLogTest DESTINATION .) CMake确实检测到boost库,但我仍然得到链接器错误,主要是forms: […]

我如何检查重构时没有破坏什么?

我即将开始在我的代码重构的一些function回合。 我有一个很好的unit testing,可以确保我没有损坏任何东西,但我不确定他们给我的报道。 有没有可以分析代码的工具,并看到function保持不变? 我打算重构一些相当孤立的代码,所以我不需要检查整个程序,只是我正在处理的区域。 对于上下文,我正在使用的代码是C / C ++,而我使用GCC和VIM在Linux中工作。