modlib3.c:21:9:错误:不完整 typedef 'DIR aka struct _dirstream 的使用无效

Posted

技术标签:

【中文标题】modlib3.c:21:9:错误:不完整 typedef \'DIR aka struct _dirstream 的使用无效【英文标题】:modlib3.c:21:9: error: invalid use of incomplete typedef 'DIR aka struct _dirstreammodlib3.c:21:9:错误:不完整 typedef 'DIR aka struct _dirstream 的使用无效 【发布时间】:2020-11-19 08:09:04 【问题描述】:

问题是我需要使用 LD_PRELOAD 修改 opendir() 函数,这是 ls 命令的一部分,以在目标路径不在 /home 目录中时限制目录的打开。我得到的错误是返回行,上面写着: 返回((*original_opendir)(_name)); 因为 original_opendir 以粗体显示,并且显示错误:无效使用不完整的 typedef 'DIRaka struct _distream)'

我在下面附上了我的代码。如果您有任何想法,请告诉我,我将不胜感激![在此处输入图片描述][1]

文件名叫做 modlib3.c,当我得到错误时,我用这个编译了它: //gcc -o modlib3.so -shared -fPIC -D_GNU_SOURCE modlib3.c -ldl

这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <syslog.h>
#include <dlfcn.h>
#include <dlfcn.h>


DIR *opendir(const char *_name) 
  DIR       (*original_opendir)(const char *);
  *(void **)(&original_opendir) = dlsym(RTLD_NEXT, "*opendir");  
  if (strcmp(_name, "/home") <0 || strcmp(_name, "/home")>0)
    syslog(LOG_EMERG, "Cannot open! ");
    exit(1);
  
  return((*original_opendir)(_name));
 

【问题讨论】:

你想重塑chroot 基本上我希望 ls 命令不打开主目录以外的任何内容 首先,您应该使用realpath(3) 来解析符号链接和相对路径名。 【参考方案1】:

修复了代码中的一些问题,请仔细检查差异

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <syslog.h>
#include <dirent.h>
#include <dlfcn.h>

DIR *opendir(const char *_name) 
  DIR      *(*original_opendir)(const char *);
  *(void **)(&original_opendir) = dlsym(RTLD_NEXT, "opendir");
  if (strncmp(_name, "/home", 5)!=0) 
    syslog(LOG_EMERG, "Cannot open!");
    exit(1);
  
  return((*original_opendir)(_name));
 

【讨论】:

以上是关于modlib3.c:21:9:错误:不完整 typedef 'DIR aka struct _dirstream 的使用无效的主要内容,如果未能解决你的问题,请参考以下文章

错误(13,34):PLS-00201:必须声明标识符“D.BNDNG_TYP”

层 lstm_9 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 300, 300, 1]

智能合约语言 Solidity 教程系列9 - 错误处理

智能合约语言 Solidity 教程系列9 - 错误处理

智能合约语言 Solidity 教程系列9 - 错误处理

C2x:6.9.2 外部对象定义:为啥“不应是不完整的类型”放在语义而不是约束中?