Build 是什么构建环境差异导致mesa GBM库的行为不同

Build 是什么构建环境差异导致mesa GBM库的行为不同,build,compilation,linker,shared-libraries,mesa,Build,Compilation,Linker,Shared Libraries,Mesa,我正在开发一个基本的演示应用程序(),通过DRM和GBMAPI进行渲染。我的应用程序使用libgbm(mesa通用缓冲区管理)的TI变体。TI提供了,和一个(Yocto)来编译它。我在他们的环境中编译了GBM,它工作得非常好 我不想使用Yocto,所以我将源代码移到自己的构建系统(buildroot)中并编译了它。一切都可以正确编译(使用相同的autotools文件),但当它运行时,调用gbm\u surface\u create时会出现分段错误。我尽可能地调试,发现程序进入gbm库,但在ret

我正在开发一个基本的演示应用程序(),通过DRM和GBMAPI进行渲染。我的应用程序使用libgbm(mesa通用缓冲区管理)的TI变体。TI提供了,和一个(Yocto)来编译它。我在他们的环境中编译了GBM,它工作得非常好

我不想使用Yocto,所以我将源代码移到自己的构建系统(buildroot)中并编译了它。一切都可以正确编译(使用相同的autotools文件),但当它运行时,调用
gbm\u surface\u create
时会出现分段错误。我尽可能地调试,发现程序进入gbm库,但在
return gbm->surface\u create(gbm,width,height,format,flags)上失败

在不同环境中编译时,会导致库运行不同的原因。是否有一些我可能丢失的真正重要的编译器或链接器标志

这是来自图形应用程序(中)的代码

这是创建设备的调用堆栈(在中)


请将您的解决方案添加为自我回答,而不是编辑question@FelixSFD我已经这样做了,但它已作为副本删除。请添加您的解决方案作为自我回答,而不是编辑question@FelixSFD我已经做了,但它作为副本被删除了
gbm.dev = gbm_create_device(drm.fd);

gbm.surface = gbm_surface_create(gbm.dev,
                                  drm.mode[DISP_ID]->hdisplay, drm.mode[DISP_ID]->vdisplay,
                                  drm_fmt_to_gbm_fmt(drm.format[DISP_ID]),
                                  GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
if (!gbm.surface) {
   printf("failed to create gbm surface\n");
   return -1;
}

return 0;
GBM_EXPORT struct gbm_device *
gbm_create_device(int fd)
{
   struct gbm_device *gbm = NULL;
   struct stat buf;

   if (fd < 0 || fstat(fd, &buf) < 0 || !S_ISCHR(buf.st_mode)) {
      fprintf(stderr, "gbm_create_device: invalid fd: %d\n", fd);
      return NULL;  
   }

   if (device_num == 0)
      memset(devices, 0, sizeof devices);

   gbm = _gbm_create_device(fd);
   if (gbm == NULL)
      return NULL;

   gbm->dummy = gbm_create_device;
   gbm->stat = buf;
   gbm->refcount = 1;

   if (device_num < ARRAY_SIZE(devices)-1)
      devices[device_num++] = gbm;

   return gbm;
}
struct gbm_device *
_gbm_create_device(int fd)
{
   const struct gbm_backend *backend = NULL;
   struct gbm_device *dev = NULL;
   int i;
   const char *b;

   b = getenv("GBM_BACKEND");
   if (b)
      backend = load_backend(b);

   if (backend)
      dev = backend->create_device(fd);

   for (i = 0; i < ARRAY_SIZE(backends) && dev == NULL; ++i) {
      backend = load_backend(backends[i]);
      if (backend == NULL)
         continue;
      fprintf(stderr, "found valid GBM backend : %s\n", backends[i]);
      dev = backend->create_device(fd);
   }

   return dev;
}

static const void *
load_backend(const char *name)
{
   char path[PATH_MAX];
   void *module;
   const char *entrypoint = "gbm_backend";

   if (name[0] != '/')
      snprintf(path, sizeof path, MODULEDIR "/%s", name);
   else
      snprintf(path, sizeof path, "%s", name);

   module = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
   if (!module) {
      fprintf(stderr, "failed to load module: %s\n", dlerror());
      return NULL;
   }
   else {
      fprintf(stderr, "loaded module : %s\n", name);
   }

   return dlsym(module, entrypoint);
}
GBM_EXPORT struct gbm_surface *
gbm_surface_create(struct gbm_device *gbm,
                   uint32_t width, uint32_t height,
                   uint32_t format, uint32_t flags)
{
   return gbm->surface_create(gbm, width, height, format, flags);
}