标签: gnu

如何理解GNU源代码?

如果这听起来有点愚蠢,我真的很抱歉.我刚读完K&R并参与了一些练习.今年夏天,对于我的项目,我正在考虑重新实现一个linux实用程序,以进一步扩展我对C的理解,所以我下载了GNU tar和sed的源代码,因为它们看起来都很有趣.但是,我无法理解它的起始位置,主要实现的位置,所有奇怪的宏来自哪里,等等.

我有很多时间,所以这不是一个真正的问题.我是否应该首先熟悉GNU工具链(即make,binutils,..)才能理解程序?或者也许我应该从更小的东西开始(如果有这样的事情)?

如果重要的话,我对Java,C++和python有一点经验.

谢谢!

c gnu project

15
推荐指数
4
解决办法
2909
查看次数

什么时候GAS ELF指令.type,.thumb,.size和.section需要?

我正在使用GNU作为基于ARM Cortex-M3的微控制器(Thumb 2指令集)的汇编程序.

在一些示例代码,我发现像指令.size,.section.type我的理解是ELF指令.举个例子:

    .section    .text.Reset_Handler
    .weak       Reset_Handler
    .type       Reset_Handler, %function  
Reset_Handler:
    bl      main
    b       Infinite_Loop    
    .size   Reset_Handler, .-Reset_Handler
Run Code Online (Sandbox Code Playgroud)



.type据说该指令设置符号的类型 - 通常是%对象(意思是数据?)或%函数.我不知道它有什么不同.它并不总是包含在内,所以我不确定何时需要使用它.

与此相关的还有.thumb_func指令.从我所看到的,它似乎可能相当于:

.thumb 
.type Symbol_Name, %function
Run Code Online (Sandbox Code Playgroud)

或者它是完全不同的东西?



.size据说设置与符号相关的大小.如果需要,我不知道.这是默认计算的,但可以使用此指令覆盖吗?如果是这样 - 你想什么时候覆盖?



.section比较容易找到的文档,我觉得我有什么清晰的概念,但我还是有点不确定的使用.我理解它的方式,它在不同的ELF部分(text代码,data可写数据,bss未初始化数据,rodata常量和其他)之间切换,并在需要时定义新的部分.我猜你会根据你是否定义代码,数据,未初始化的数据等来切换它们.但是为什么要为函数创建一个子部分,如上例所示?


对此有任何帮助表示赞赏.如果您能找到更详细地解释这一点的教程或文档的链接 - 最好是新手可以理解的 - 我将非常感激.

到目前为止,使用手册已经有了一些帮助 - 也许你可以通过更多的知识获得比我更多的东西.

assembly arm gnu gnu-assembler elf

15
推荐指数
3
解决办法
8638
查看次数

了解GNU链接器脚本的位置计数器

我正在开展一个大学项目,我正在从头开始为Atmel SAM7S256微控制器编写软件.这比我之前使用的其他MCU更深入,因为这次需要了解链接器脚本和汇编语言.

我一直在仔细审查SAM7S芯片的示例项目,以便完全了解如何从头开始SAM7/ARM项目.一个明显的例子是米罗萨梅克的"建筑裸机ARM系统的GNU"教程发现这里(其中在该问题的代码是从).我也花了很多时间从sourceware.org阅读链接器和汇编程序文档.

我很高兴我在大多数情况下理解以下链接器脚本.只有一件涉及到位置计数器的东西对我来说没有意义.以下是上述教程提供的链接描述文件:

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_vectors)

MEMORY {                                       /* memory map of AT91SAM7S64 */
    ROM (rx)  : ORIGIN = 0x00100000, LENGTH = 64k
    RAM (rwx) : ORIGIN = 0x00200000, LENGTH = 16k
}

/* The sizes of the stacks used by the application. NOTE: you need to adjust */
C_STACK_SIZE   = 512;
IRQ_STACK_SIZE = 0;
FIQ_STACK_SIZE = 0;
SVC_STACK_SIZE = 0;
ABT_STACK_SIZE = 0;
UND_STACK_SIZE = 0;

/* The size of the heap used by …
Run Code Online (Sandbox Code Playgroud)

embedded linker arm gnu linker-scripts

15
推荐指数
2
解决办法
8782
查看次数

如何在gnu/linux上安装boost

有这么多的教程,但没有说明我如何正确安装这个库.我想将它安装在默认的gnu/linux库目录中.

我试过了:

$ sudo ./bootstrap.sh
$ ./b2 install
Run Code Online (Sandbox Code Playgroud)

现在它安装在哪里?它安装了吗?

运行后./b2 install我得到以下输出:

z@z-comptuer:~/Desktop/.mess/boost_1_55_0/tools/build/v2$ sudo ./b2 install
warning: No toolsets are configured.
warning: Configuring default toolset "gcc".
warning: If the default is wrong, your build may not work correctly.
warning: Use the "toolset=xxxxx" option to override our guess.
warning: For more configuration options, please consult
warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html
...found 580 targets...
...updating 306 targets...
common.mkdir /usr/local/share/boost-build
common.mkdir /usr/local/share/boost-build/tools
common.copy /usr/local/share/boost-build/tools/msvc.jam
common.copy /usr/local/share/boost-build/tools/cast.py
common.copy /usr/local/share/boost-build/tools/qt4.jam
common.copy /usr/local/share/boost-build/tools/make.jam
common.copy /usr/local/share/boost-build/tools/common.jam
common.copy …
Run Code Online (Sandbox Code Playgroud)

c++ linux boost gnu

15
推荐指数
1
解决办法
3万
查看次数

处理文件路径跨平台

是否存在处理跨平台路径的C++ GNU独立类?我的应用程序构建在Windows和LInux上.我们的配置文件引用单独目录中的另一个文件.我希望能够将其他配置文件的路径读入一个可以在Linux或Windows上运行的类.

哪个类提供最小的占用空间来转换在任一系统上使用的路径?谢谢

c++ linux windows cross-platform gnu

14
推荐指数
3
解决办法
1万
查看次数

如何在GNU/Linux中记录使用磁盘的进程或内核活动?

在特定的Debian服务器上,iostat(和类似的)报告正在进行的磁盘写入的意外高容量(以字节为单位).我无法确定哪些进程正在执行这些写操作.

两个有趣的观点:

  1. 试图一次关闭一个系统服务无济于事.磁盘活动保持相当稳定且意外地高.

  2. 尽管写了,但似乎并没有消耗更多的磁盘空间.

这两个让我觉得写作可能是内核正在做的事情,但我没有交换,所以我不清楚Linux可能会尝试编写什么.

可以试试看:

http://www.atcomputing.nl/Tools/atop/

但是想避免修补我的内核.

有关如何追踪此问题的任何想法?

linux io gnu disk

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

在Linux C++应用程序中查找和读取大文件

我使用G ++中的标准ftellfseek选项进入整数溢出,但我想我错了,因为似乎ftell64fseek64不可用.我一直在搜索,许多网站似乎使用lseekoff64_t数据类型引用,但我没有找到任何引用等于fseek的例子.我现在正在阅读的文件是16GB + CSV文件,期望至少翻倍.

没有任何外部库,实现与fseek/ftell对类似的结构最简单的方法是什么?我的应用程序现在使用4.x的标准GCC/G ++库.

c c++ linux gnu large-files

14
推荐指数
4
解决办法
3万
查看次数

gnu syslog(),openlog()和closelog()线程安全吗?

我一直在寻找一些时间,但还没有找到明确的答案.到目前为止,我发现的唯一链接就是这里.

c linux gnu syslog

14
推荐指数
3
解决办法
6336
查看次数

ELF中程序头和节头之间的区别

Q1 ELF中程序头和节头之间有什么区别

Q1.1段和段之间有什么区别?

我相信pheaders只指向部分.

Q2.什么是文件头和程序头之间的差异

根据gnu ld链接器脚本,使用Id:GNU链接器:

PHDRS
{
name type [ FILEHDR ] [ PHDRS ] [ AT ( address ) ]
[ FLAGS ( flags ) ] ;
}
Run Code Online (Sandbox Code Playgroud)

您可以在程序标题类型后面使用FILEHDR和PHDRS关键字来进一步描述该段的内容.FILEHDR关键字表示该段应包含ELF文件头.PHDRS关键字表示该段应包含ELF程序头本身

This is a bit confusing
Run Code Online (Sandbox Code Playgroud)

c arm gnu elf linker-scripts

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

错误:无法将'std :: basic_string <char> :: iterator ...'转换为'const char*for argument'1'...'

我收到以下错误:

error: cannot convert 'std::basic_string<char>::iterator {aka __gnu_cxx::__normal
_iterator<char*, std::basic_string<char> >}' to 'const char*' for argument '1' 
to 'int remove(const char*)'
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当我在Mac上工作时,我的程序编译得很完美...但是一旦我使用Linux机器,这个错误就会出现在多个地方.(如果有人能解释为什么会这样,那就太好了!)

这是弹出错误的实例之一:

SomeClass::SomeClass(string t, string art, Time dur) {
    char chars[] = ",";
    t.erase(std::remove(t.begin(), t.end(), chars[0]), t.end());
    art.erase(std::remove(art.begin(), art.end(), chars[0]), art.end());
    // Some more code ...
}
Run Code Online (Sandbox Code Playgroud)

更具体地说,错误来自这一行:

t.erase(std::remove(t.begin(), t.end(), chars[0]), t.end());
Run Code Online (Sandbox Code Playgroud)

有谁知道如何处理这个问题?

c++ gnu compiler-errors std char

14
推荐指数
1
解决办法
8751
查看次数