草庐IT

linux - 共享库中库函数的选择性静态链接

我想创建一个使用来自第3方静态库的函数的共享库。例如,libfoobar.a中的foo和bar。我知道我的主应用程序也在使用foo并将导出该符号。所以我只是想在bar中链接以节省代码大小并保留“foo”未解析(因为它将由主应用程序提供)。如果我包含libfoobar.a,链接器ld将在我的共享库中包含这两个函数。如果我不包含libfoobar.a,我的库将无法访问函数bar,因为应用程序本身没有链接到bar。问题:有没有办法告诉ld在构建共享库时只解析某些符号?将libfoobar.a变成共享库?从libfoobar.a中提取包含函数bar的文件并在链接器行上指定?别担心,运行时加载程

linux - 具有短期发布者和长期订阅者的 PUB/SUB

上下文:操作系统:Linux(Ubuntu),语言:C(实际上是Lua,但这应该无关紧要)。我更喜欢基于ZeroMQ的解决方案,但会接受任何足够理智的解决方案。注意:由于技术原因,我不能在这里使用POSIX信号。我在一台机器(“workers”)上有几个相同的长生命周期进程。有时我需要通过命令行工具向每个进程发送控制消息。示例:$command-and-controlworker-typerun-collect-garbage这台机器上的每个工作人员都应该收到一条run-collect-garbage消息。注意:如果该解决方案以某种方式适用于集群中所有机器上的所有工作人员,那就太完美了

linux - 具有短期发布者和长期订阅者的 PUB/SUB

上下文:操作系统:Linux(Ubuntu),语言:C(实际上是Lua,但这应该无关紧要)。我更喜欢基于ZeroMQ的解决方案,但会接受任何足够理智的解决方案。注意:由于技术原因,我不能在这里使用POSIX信号。我在一台机器(“workers”)上有几个相同的长生命周期进程。有时我需要通过命令行工具向每个进程发送控制消息。示例:$command-and-controlworker-typerun-collect-garbage这台机器上的每个工作人员都应该收到一条run-collect-garbage消息。注意:如果该解决方案以某种方式适用于集群中所有机器上的所有工作人员,那就太完美了

c - 互斥访问和系统调用

我知道在Linux中mutexes在下面被实现为futexes而futex使用compare-and-swap机制。通常对于获取锁,用户空间线程不需要进行系统调用,因为锁是在用户空间中解析的。现在我的问题是当竞争激烈并且许多线程试图同时锁定互斥体时会发生什么。然后是否会发生系统调用,以便内核决定向哪个线程授予互斥锁?特别是当线程优先级不同时?我自己也这么认为。 最佳答案 只要没有争用,就不会进行系统调用。如果存在争用,则会进行系统调用以将线程放休眠眠队列,然后该队列将用于查找第一个在互斥体空闲时唤醒的线程。此外,在系统调用中对fut

c - 互斥访问和系统调用

我知道在Linux中mutexes在下面被实现为futexes而futex使用compare-and-swap机制。通常对于获取锁,用户空间线程不需要进行系统调用,因为锁是在用户空间中解析的。现在我的问题是当竞争激烈并且许多线程试图同时锁定互斥体时会发生什么。然后是否会发生系统调用,以便内核决定向哪个线程授予互斥锁?特别是当线程优先级不同时?我自己也这么认为。 最佳答案 只要没有争用,就不会进行系统调用。如果存在争用,则会进行系统调用以将线程放休眠眠队列,然后该队列将用于查找第一个在互斥体空闲时唤醒的线程。此外,在系统调用中对fut

linux - 使用 GNU 汇编程序在 x86_64 中调用 printf

我使用AT&T语法编写了一个程序,用于GNU汇编程序:.dataformat:.ascii"%d\n".text.globalmainmain:mov$format,%rbxmov(%rbx),%rdimov$1,%rsicallprintfret我使用GCC来汇编和链接:gcc-omainmain.s我用这个命令运行它:./main当我运行该程序时出现段错误。通过使用gdb,它说printfnotfound。我试过“.externprintf”,它不起作用。有人建议我应该在调用printf之前存储堆栈指针并在RET之前恢复,我该怎么做? 最佳答案

linux - 使用 GNU 汇编程序在 x86_64 中调用 printf

我使用AT&T语法编写了一个程序,用于GNU汇编程序:.dataformat:.ascii"%d\n".text.globalmainmain:mov$format,%rbxmov(%rbx),%rdimov$1,%rsicallprintfret我使用GCC来汇编和链接:gcc-omainmain.s我用这个命令运行它:./main当我运行该程序时出现段错误。通过使用gdb,它说printfnotfound。我试过“.externprintf”,它不起作用。有人建议我应该在调用printf之前存储堆栈指针并在RET之前恢复,我该怎么做? 最佳答案

c - 模拟ARM代码

我想模拟ARM代码。例如,我想运行这样的代码:MOVR0,#5ADDR0,R0,#1//somehowoutputR0它会在我的Ubuntu上的某些软件上输出6。可能吗? 最佳答案 KeilMDK可以用来模拟ARM代码。它提供了一个Simulate/Debug可用于探测ARM寄存器集、内存内容等的透视图...MDK-Lite评估版免费提供,最大代码大小为32KB。MDK的Linux版本不可用。但是KeilMDK在WINE上工作得很好在Ubuntu中。在WINE上安装KeiluVisionMDK:第一步:在Ubuntu上安装wine打

c - 模拟ARM代码

我想模拟ARM代码。例如,我想运行这样的代码:MOVR0,#5ADDR0,R0,#1//somehowoutputR0它会在我的Ubuntu上的某些软件上输出6。可能吗? 最佳答案 KeilMDK可以用来模拟ARM代码。它提供了一个Simulate/Debug可用于探测ARM寄存器集、内存内容等的透视图...MDK-Lite评估版免费提供,最大代码大小为32KB。MDK的Linux版本不可用。但是KeilMDK在WINE上工作得很好在Ubuntu中。在WINE上安装KeiluVisionMDK:第一步:在Ubuntu上安装wine打

linux - 在关联文件中增加新版本的版本号(文档)

我很想知道你们如何处理增加版本号的新版本问题。如何处理相关文件(如手册页等)中的版本号该软件是使用gnu工具链构建的,因此autoconf、automake等可用并用于应用程序的版本号。这样信息就可以重复使用。git作为vcs使用。一种可能性是在Makefile.am中引入一个额外的、新的目标,它执行sed/awk以替换所有相关文件中的版本号和日期。该目标可以在新版本开发的开始(分支之后)调用一次。然后当人们对项目进行git克隆或发布tarball完成时,项目可以使用正确的信息构建。当然,在开始开发新版本时,必须记住运行这个make目标。另一种选择是用dist目标的钩子(Hook)替换