January 11 2007 木曜日

本文详细介绍了 dlopen 函数如何从指定文件名加载动态库并返回句柄,包括搜索路径、依赖解析方式、符号解析时机及特殊伪句柄的使用。并通过一个示例展示了如何使用 dlopen 加载数学库并调用其中的 cos 函数。

 dlopen loads a dynamic library from the file named by the null terminated string filename and returns
an opaque "handle" for the dynamic library.  If filename is not an absolute path (i.e., it does not
begin with a "/"), then the file is searched for in the following locations:

  A colon-separated list of directories in the user’s LD_LIBRARY_PATH environment variable.  The list of
libraries cached in /etc/ld.so.cache.

              /lib, followed by /usr/lib.

  If filename is a NULL pointer, then the returned handle is for the main program.

  External  references in the library are resolved using the libraries in that library’s dependency
list and any other libraries previously opened with the RTLD_GLOBAL flag.  If the executable was linked
with the flag "-rdynamic", then the global symbols in the executable will also be used to resolve
references in a dynamically loaded library.

  Flag must be either RTLD_LAZY, meaning resolve undefined symbols as code from the dynamic library is
executed, or RTLD_NOW, meaning resolve all undefined symbols before dlopen returns, and fail if this
cannot be done.  Optionally, RTLD_GLOBAL may be or’ed with flag, in which case the external symbols
defined in the library will be made available to subsequently loaded libraries.

  If the library exports a routine named _init, then that code is executed before dlopen returns.
If the same library is loaded twice with dlopen(), the same file handle is returned.  The dl library
maintains link counts for dynamic file handles, so a dynamic library is not deallocated until dlclose
has been called on it as many times as dlopen has succeeded on it.

  If dlopen fails for any reason, it returns NULL.  A human readable string describing the most recent
error that occurred from any of the dl routines (dlopen, dlsym or dlclose) can be extracted with dlerror().
dlerror returns NULL if no errors have occurred since initialization or since it was last called.
(Calling dlerror() twice consecutively, will always result in the second call returning NULL.)

  dlsym takes a "handle" of a dynamic library returned by dlopen and the null terminated symbol name,
returning the address where that symbol is loaded.  If the symbol is not found, dlsym returns NULL;
however, the correct way to test for an error from dlsym is to save the result of dlerror into a variable,
and then check if saved  value  is  not  NULL.  This is because the value of the symbol could actually
be NULL.  It is also necessary to save the results of dlerror into a variable because if dlerror is
called again, it will return NULL.

  There are two special pseudo-handles, RTLD_DEFAULT and RTLD_NEXT.  The former will find the first
occurrence of the desired symbol using the default library search order.  The latter, which is usable
only from within a dynamic library, will find the next occurrence of a function in the search order
after the current library.  This allows one to provide a wrapper around a function in another shared library.

  dlclose decrements the reference count on the dynamic library handle handle.  If the reference count
drops to zero and no other loaded libraries use symbols in it, then the dynamic library is unloaded.
If the dynamic library exports a routine named _fini, then that routine is called just before the library
is unloaded.

RETURN VALUE
       dlclose returns 0 on success, and non-zero on error.

EXAMPLE
       Load the math library, and print the cosine of 2.0:
              #include <stdio.h>
              #include <dlfcn.h>

              int main(int argc, char **argv) {
                  void *handle;
                  double (*cosine)(double);
                  char *error;

                  handle = dlopen ("libm.so", RTLD_LAZY);
                 if (!handle) {
                      fprintf (stderr, "%s/n", dlerror());
                      exit(1);
                  }

                  cosine = dlsym(handle, "cos");
                  if ((error = dlerror()) != NULL)  {
                      fprintf (stderr, "%s/n", error);
                      exit(1);
                  }

                  printf("%f/n", (*cosine)(2.0));
                  dlclose(handle);
                  return 0;
              }

       If this program were in a file named "foo.c", you would build the  pro-
       gram with the following command:

              gcc -rdynamic -o foo foo.c -ldl

NOTES
       The  symbols  RTLD_DEFAULT  and RTLD_NEXT are defined by <dlfcn.h> only
       when _GNU_SOURCE was defined before including it. 

内容概要:本文为《科技类企业品牌传播白皮书》,系统阐述了新闻媒体发稿、自媒体博主种草与短视频矩阵覆盖三大核心传播策略,并结合“传声港”平台的AI工具与资源整合能力,提出适配科技企业的品牌传播解决方案。文章深入分析科技企业传播的特殊性,包括受众圈层化、技术复杂性与传播通俗性的矛盾、产品生命周期影响及2024-2025年传播新趋势,强调从“技术输出”向“价值引领”的战略升级。针对三种传播方式,分别从适用场景、操作流程、效果评估、成本效益、风险防控等方面提供详尽指南,并通过平台AI能力实现资源智能匹配、内容精准投放与全链路效果追踪,最终构建“信任—种草—曝光”三位一体的传播闭环。; 适合人群:科技类企业品牌与市场负责人、公关传播从业者、数字营销管理者及初创科技公司创始人;具备一定品牌传播基础,关注效果可量化与AI工具赋能的专业人士。; 使用场景及目标:①制定科技产品全生命周期的品牌传播策略;②优化媒体发稿、KOL合作与短视频运营的资源配置与ROI;③借助AI平台实现传播内容的精准触达、效果监测与风险控制;④提升品牌在技术可信度、用户信任与市场影响力方面的综合竞争力。; 阅读建议:建议结合传声港平台的实际工具模块(如AI选媒、达人匹配、数据驾驶舱)进行对照阅读,重点关注各阶段的标准化流程与数据指标基准,将理论策略与平台实操深度融合,推动品牌传播从经验驱动转向数据与工具双驱动。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值