Linux基础 --调试工具之ltrace的移植

ltrace 编译与使用 FAQ

1. 获取源码

首先从 ltrace 的官方仓库获取源码。你可以从 ltrace 的 GitHub 仓库 获取最新版本的源码。

git clone https://github.com/dkogan/ltrace.git
cd ltrace

2. 安装依赖

确保你的系统上安装了构建 ltrace 所需的依赖工具。一般来说,需要安装以下工具:

sudo apt-get update
sudo apt-get install build-essential autoconf automake libtool

3. 构建与安装

在源码目录下执行以下命令来构建和安装 ltrace:

./autogen.sh
./configure
make
sudo make install

4. 编译时遇到 readdir_r 弃用问题

问题描述

编译时可能会遇到以下错误:

proc.c: In function ‘process_tasks’:
proc.c:247:3: error: ‘readdir_r’ is deprecated [-Werror=deprecated-declarations]
   if (readdir_r(d, &entry, &result) != 0) {
   ^~
...
cc1: all warnings being treated as errors
...

解决方案

这是由于 readdir_r 函数在新的 glibc 版本中被弃用,可以将 readdir_r 替换为 readdir,因为 readdir 现在被认为是线程安全的,只要每个线程有自己的 DIR 结构。

方案 1: 替换 readdir_rreaddir

找到 proc.c 文件中的第 247 行,将:

if (readdir_r(d, &entry, &result) != 0) {

替换为:

errno = 0;
result = readdir(d);
if (result == NULL && errno != 0) {

还需要将对应的 readdir_r 的参数修改为适合 readdir 的参数:

struct dirent *result;

修改后,代码可能类似于:

struct dirent *result;
errno = 0;
result = readdir(d);
if (result == NULL && errno != 0) {
    // 错误处理
} else {
    entry = *result;
    // 正常处理
}
方案 2: 禁用将弃用的声明视为错误的编译选项

可以修改 Makefile,在编译选项中加入 -Wno-deprecated-declarations 选项,这样编译器会忽略弃用警告。

找到 Makefile 文件并添加该选项,例如:

CFLAGS += -Wno-deprecated-declarations
方案 3: 使用环境变量

可以通过设置环境变量来忽略特定警告:

export CFLAGS="-Wno-deprecated-declarations"

然后重新运行 ./configuremake

方案 4: 更新代码库

检查是否有新的 ltrace 版本,这些版本可能已经解决了这个问题。你可以尝试从官方仓库获取最新的代码。

git pull origin master

5. 编译后将目标文件集中到一个目录

使用 Makefile 集中目标文件

可以在 Makefile 中使用内建的目标文件目录管理功能来将目标文件集中到一个指定目录。这可以通过定义一个变量来指定目标文件目录,并在编译规则中使用该变量。

定义目标文件目录

在 Makefile 顶部定义目标文件目录变量,例如:

OBJDIR = ./obj
SRCDIR = ./src
定义源文件和目标文件

使用变量来定义源文件和目标文件列表:

SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES))
编译规则

修改编译规则,将目标文件输出到指定目录:

$(OBJDIR)/%.o: $(SRCDIR)/%.c
    @mkdir -p $(OBJDIR)
    $(CC) $(CFLAGS) -c $< -o $@
链接规则

使用目标文件列表进行链接:

TARGET = my_program

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -o $@

.PHONY: clean
clean:
    rm -rf $(OBJDIR) $(TARGET)

完整示例

以下是一个完整的 Makefile 示例,将源文件编译为目标文件并集中到一个目录中:

# 定义编译器和编译选项
CC = gcc
CFLAGS = -Wall -g

# 定义目标文件目录和源文件目录
OBJDIR = ./obj
SRCDIR = ./src

# 定义源文件和目标文件
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES))

# 定义目标可执行文件
TARGET = my_program

# 编译规则:将源文件编译为目标文件
$(OBJDIR)/%.o: $(SRCDIR)/%.c
    @mkdir -p $(OBJDIR)
    $(CC) $(CFLAGS) -c $< -o $@

# 链接规则:将目标文件链接为可执行文件
$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -o $@

# 清理规则:删除目标文件和可执行文件
.PHONY: clean
clean:
    rm -rf $(OBJDIR) $(TARGET)

使用方法

  1. 将你的源文件放在 src 目录中。
  2. 在 Makefile 所在目录下运行 make,它会自动编译源文件并将目标文件放在 obj 目录中,然后生成可执行文件 my_program
  3. 运行 make clean 来清理生成的目标文件和可执行文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值