>
> Are there any differences?
Yes, because those are before this subtraction in store_load_module_symbols():
lm->mod_load_symend--;
if (!MODULE_MEMORY() && !MODULE_END(lm->mod_load_symend) &&
>
>>
>>>> +/* Only for 6.4 and later */
>>>> +struct syment *
>>>> +next_module_symbol(char *symbol, struct syment *sp_in, ulong val_in)
>>>> +{
>>>> + int i, j, k;
>>>> + struct load_module *lm;
>>>> + struct syment *sp, *sp_end;
>>>> +
>>>> + if (symbol)
>>>> + goto symbol_search;
>>>> + if (val_in)
>>>> + goto value_search;
>>>> +
>>>> + /* for sp_in */
>>>> + for (i = 0; i < st->mods_installed; i++) {
>>>> + lm = &st->load_modules[i];
>>>> +
>>>> + /* quick check: sp_in is not in the module range. */
>>>> + if (sp_in < lm->symtable[lm->address_order[0]] ||
>>>> + sp_in >
>> lm->symend[lm->address_order[lm->nr_mems-1]])
>>>> + continue;
>>>> +
>>>> + for (j = 0; j < lm->nr_mems; j++) {
>>>> + k = lm->address_order[j];
>>>> + if (sp_in < lm->symtable[k] || sp_in >
>>>> lm->symend[k])
>>>> + continue;
>>>> +
>>>> + if (sp_in == lm->symend[k])
>>>> + return next_module_symbol(NULL, NULL,
>>>> sp_in->value);
>>>> +
>>>>
>>>
>>> This means it has to be invoked recursively.
>>
>> It looks to be a recursive call, but actually it's just a composite
>> of three functions, i.e. symbol, syment and value search, and the
>> value search does not do a recursive call. So I think it's not a
>> real recursive call.
>>
>>
> Ok, but it looks unusual and hard to understand.
ok, I will try to split the function into e.g.
next_module_symbol_by_syment()
next_module_symbol_by_symname()
next_module_symbol_by_value()
Thanks,
Kazu